Страницы

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

четверг, 8 ноября 2018 г.

Принцип работы вложенных функций или “непонятное замыкание” в JavaScript

Сейчас я прохожу самостоятельное обучение на одном из онлайн-ресурсов по JavaScript. В нем помимо теории есть еще и задачки. Так вот на одной из задач в теме "Область видимости. Замыкания" я столкнулся с полным непониманием решения задачи, которую предлагает автор (свое решение у меня было только одно, и его я рассматривать не буду - ниже задача с кодом и примерами от автора).
Задание:
Следующий код создает массив функций-стрелков shooters. По замыслу, каждый стрелок должен выводить свой номер:
function makeArmy() {
var shooters = [];
for (var i = 0; i < 10; i++) { var shooter = function() { // функция-стрелок alert( i ); // выводит свой номер }; shooters.push(shooter); }
return shooters; }
var army = makeArmy();
army[0](); // стрелок выводит 10, а должен 0 army[5](); // стрелок выводит 10... // .. все стрелки выводят 10 вместо 0,1,2...9
Почему все стрелки́ выводят одно и то же? Поправьте код, чтобы стрелки работали как задумано. Предложите несколько вариантов исправления. (Вопрос автора задания)
Предложенные автором варианты решения, которые мне непонятны:
(1) Использовать дополнительную функцию для того, чтобы «поймать» текущее значение i:
function makeArmy() {
var shooters = [];
for (var i = 0; i < 10; i++) {
var shooter = (function(x) {
return function() { alert( x ); };
})(i);
shooters.push(shooter); }
return shooters; }
var army = makeArmy();
army[0](); // 0 army[1](); // 1
Я так и не понял этот вариант решения задания. Что дают в этом варианте эти вторые скобки с i и почему в JavaScript, в отличии от других нормальных языков типа Java x = i хотя имена у параметров разные. Иными словами я не понимаю, как происходит отлавливание i.
(2) Обернуть весь цикл во временную функцию:
function makeArmy() {
var shooters = [];
for (var i = 0; i < 10; i++)(function(i) {
var shooter = function() { alert( i ); };
shooters.push(shooter);
})(i);
return shooters; }
var army = makeArmy();
army[0](); // 0 army[1](); // 1
Этот вариант решения задания еще больше вводит меня в ступор. Где вообще хранится значения i каждого стрелка? Какую роль во всем этом играют вторые скобки с параметром (i)?


Ответ

Проблема с переменной возникает из-за замыкания функции на контекст, то есть на внешнюю переменную i. Это можно легко определить, если вывести доступ к этой переменной во внешний код. Я буду использовать вывод на консоль вместо всплывающего сообщения.
function makeArmy() { var shooters = [];
for (makeArmy.i = 0; makeArmy.i < 10; makeArmy.i++) { var shooter = function() { console.log( makeArmy.i ); }; shooters.push(shooter); }
return shooters; }
Теперь наглядна видна зависимость и что функция выводит переменную к которой привязана во время вызова. А к моменту вызова цикл полностью прошел и переменная равна конечному значению 10
var shooters = makeArmy(); a[0](); //выведет 10 makeArmy.i = 20; a[0](); //выведет 20
Соответственно, для нормального формирования функции надо эту связь разорвать и скопировать текущий номер внутри цикла.
[Решение]
Это можно сделать через дополнительную функцию, которая скопирует значение, я упрощу пример для этого:
function test(){ var i = 0;
result = function(){ console.log(i); };
i = 10; return result; }
test()(); //test() возвращает функцию, вторые скобки для мгновенного вызова вернувшейся функции
Нам надо сделать так, что бы переменная не замыкалась, а копировалась. Одним из способов является передать переменную в качестве параметра функции, в таком случае она скопируется, а не замкнется. А внутри мы сформируем нужную нам функцию или объект на эту скопированную переменную.
function test(){ var i = 0;
var makeResult = function(x){ return function(){ console.log(x); }; } var result = makeResult(i); // вызываем функцию и передаем ей параметр который скопируется внутри и из него сформируется нужная функция.
i = 10; return result; } test()(); //выводит 0
Таким образом мы обошли замыкание на внешний контекст благодаря копированию при вызове с параметром. На самом деле это можно упростить, сразу вызвав функцию makeResult
function test(){ var i = 0;
var result = function(x){ return function(){ console.log(x); }; }(i); //сразу вызываем
i = 10; return result; } test()(); //выводит 0
Тоже самое касается цикла с солдатами, мы сделали промежуточную функцию, которая сформировала нужную и вернула ее по мере увеличения переменной i
function test(){ var results = []; for(var i = 0; i < 10; i++){ var result = function(x){ return function(){ console.log(x); }; }(i); results.push(result); } return results; } test()[5]();
Что в первом, что во втором примерах делается одно и то же - вызывается промежуточная функция с параметром для копирования и разрыва контекста. Только в одном формируется просто целевая функция, а во втором весь объект целиком.

Каков принцип работы метода compareTo()?

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


Ответ

Строки в Java(и вообще много где) сравниваются с помощью Лексикографического порядка. О том, что это такое можно почитать так же тут. Общий смысл, по алфавиту.
Если говорить именно про класс String, то он реализует интерфейс Comparable в документации подробно описано, что должен возвращать метод compareTo(). Если вкратце, то он определяет порядок элементов.
o1.compateTo(o2)
> 0 - если o1 должен идти после o2 (в случаем с числами o1>o2, со строками, по алфавиту o2 идёт раньше o1)
=0 - если o1 и o2 равнозначны (не обязательно равны! НО, если o1.equals(o2) == true, то желательно, чтобы o1.compareTo(o2) == 0, иначе теряется консистентность)
<0 - если o1 должен идти перед o2 (в случаем с числами o1

Кнопка “назад” в левом верхнем углу

Здравствуйте. Помогите с проблемой: как добавить кнопку "назад" в левый верхний угол экрана. Везде написано, как это сделать через Actionbar, но не сказано, можно ли это сделать Toolbar
Код выглядит так:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
И xml


Заранее благодарю за ответ.


Ответ

Все осталось по старому - в onCreate
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true);

Как узнать точный размер физического диска?

Как узнать размер физического диска (не раздела!) в Windows 7 с точностью до байта?
Управление компьютером -> Управление дисками показывает значение в ГБ.


Ответ

Воспользуйтесь встроенной программой "Сведения о системе". Пуск - Выполнить - msinfo32 Раздел "Компоненты - Запоминающие устройства - Диски"

Как надо выделять память

Суть вопроса. Есть класс:
class a { private: int **something;
public: a(); ~a(); };
Собственно, как правильно выделять память под двумерный динамический массив? А точнее, где? Некоторые источники указывают на то, что надо не «перегружать» конструктор лишними вычислениями и выделением памяти, а засунуть все в другой метод.
a(){something = nullptr;} void doMemory(){ /* выделение памяти */ } ~a(){if(something != nullptr) /* высвобождаем */);}
По моим соображениям "засунуть все в другой метод" интересен, если мы создаем больше объекты и они просто лежат в памяти и ждут своего часа, а когда этот час настает, мы берем объект выделяем под него память и сразу работаем с ним, и он дальше лежит ждет своего часа.


Ответ

Когда выделять?
Выделять память нужно в конструкторе, освобождать - в деструкторе. Это - реализация одной из важнейших концепций C++ - RAII (получение ресурса есть инициализация). Если ее нарушить, программа будет либо ненадежной, либо потребуется в каждом методе следить - выделена ли память.
Выделять крупный блок или матрицу указателей?
Зависит от размеров и от того, что нужно в дальнейшем с этой матрицей делать.
Если программа работает с гигабайтами данных, и работает не один раз, а в несколько проходов (выделяя и освобождая память между ними), может оказаться, что адресное пространство сильно фрагментировано, и такого длинного куска, как вам нужно - просто нет.
Для 64 бит это не так актуально, но есть на свете и 32 битные системы (в мобильниках и так далее).
Если этим данным предстоит параллельная обработка на многоядерной системе с NUMA, а вы выделили память крупным блоком, эта самая NUMA вставит вам палки в колеса, когда процессоры полезут не в свои банки памяти за данными - при выделении построчно вероятность такого будет меньше.
Итого: Каждый сценарий обработки данных требует индивидуального выбора способа их хранения.

Просмотр изменений на удаленном репозитории

Можно ли с локального рабочего места посмотреть:
Были ли изменения в удаленном репозитории Какие это были изменения
Чтобы принять решение - вливать-не вливать и что вливать? нашел решение для просмотра изменений diff после fetch
git diff HEAD...origin/master git diff HEAD...origin/branch1
насколько оно правомочно? вывод вполне наглядный


Ответ

команда pull программы git на самом деле является последовательностью двух команд: fetch и merge
fetch — получает обновившиеся указатели (т.е., ветки — branch, и метки — tag) и скачивает все необходимые для их (указателей) использования объекты (т.е., коммиты — commit, деревья — tree и «блобы» — blob, binary large object).
merge указатель — пытается осуществить «вливание» коммита (и всех промежутоных коммитов), на который ссылается указатель, в вашу текущую ветку (ветка в git — это плавающий указатель на коммит).
выполнив не pull, а только первую часть — fetch
$ git fetch
вы получите возможность просмотреть, какие коммиты сейчас отделяют ваш локальный указатель (например, ветку master) от другого указателя, полученного из удалённого репозитория (если репозиторий подключен всего один, то называется по умолчанию — origin), например, одноимённой ветки master, которую можно обозначить как origin/master
$ git log master..origin/master
две точки здесь — это часть синтаксиса.
какие именно произошли изменения и в каких файлах, можно увидеть, добавив команде log опцию -p
$ git log -p master..origin/master
а можно посмотреть и полный список отличий в файлах между двумя указателями:
$ git diff master..origin/master

нашел решение для просмотра изменений diff после fetch git diff HEAD...origin/master насколько оно правомочно?
вполне правомочно.
и полностью соответствует выводу git diff master..origin/master, если master — ваша текущая ветка. уточнить вы можете с помощью команды git status, или более «низкоуровнево», заглянув в содержимое файла .git/HEAD. пример:
$ cat .git/HEAD ref: refs/heads/master
здесь указатель HEAD ссылается именно на локальную ветку master

Как сделать иконки в Navigation Drawer цветными?

Не понимаю почему, но иконки отображаются серыми, хотя сами они все цветные.

Вот код Activity_main.xml, может быть пригодится.





Ответ

Попробуйте оттенок убрать
navigationView.setItemIconTintList(null);

Области видимости

В каких случаях следует применять области видимости? public static protected private


Ответ

Области видимости помогают вам определить, что относится к "потрошкам" реализации, а что нет. Публичная область видимости говорит всем остальным: смотрите, я предоставляю вот этот функционал:
class RepositoryFactory { public function getRepository(string clazz) { ... } }
Все методы, которые относятся к внутренностям проекта, должны быть private или protected - это не защита от хокиров, это способ скрыть ненужное от тех, кто использует ваш класс
class RepositoryFactory { private function checkClassExistence(string clazz) { ... } }
В данном случае указанный метод вряд ли будет интересен внешнему миру, он нужен только для помощи публичным методам, поэтому он скрывается.
Разница между protected и private заключается лишь в том, что protected можно переопределить в классе-наследнике, таким образом тот же RepositoryFactory может проводить какие-то свои внутренние проверки прежде чем предпринимать какие-то действия - и эти проверки могут быть расширены или сужены в классе-наследнике. Чтобы предоставить такую возможность наследникам, метод объявляется как protected:
class RepositoryFactory { protected function isValidRepositoryClazz(string clazz) { ... } }
Обычно такой функционал требуется в очень редких случаях, и практически вся внутрянка выносится в private
Модификатор static не является модификатором области видимости и управляет контекстом, в котором существует поле или метод. В обычном случае мы оперируем в контексте конкретного экземпляра класса, в случае употребления static мы оперируем в контексте самого класса; таким образом статические методы не имеют this и могут быть вызваны из любой части программы, а статические переменные существуют только в единственном экземпляре во всей программе (в отличие от полей экземпляра, привязанных к конкретному экземпляру).

Табуляция и пробел

Что такое табуляция? Как ее описать в джава коде и почему некоторые люди пишут, что всегда лучше использовать табуляцию?


Ответ

Табуляция - это непечатаемый (управляющий) символ, в общем случае вводится по нажатию на клавишу Tab на клавиатуре.
Хорошей практикой является выделение логических блоков в коде (циклов, условий, классов и методов) с помощью табуляции или нескольких (обычно - четырёх) пробелов. Это служит для удобочитаемости кода и ускоряет его восприятие.
Сравните варианты с табуляцией и без:
С табуляцией:
package helloworld;
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } }
Без табуляции:
package helloworld; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } }

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

У меня есть объект с полем скорость (speed). Я хочу, чтобы другие объекты могли использовать её значение, то есть, по факту, иметь доступ к переменной скрипта (по разным причинам это может понадобиться).
Как я могу получить доступ к переменной объекта, чтоб все изменения, которые в нем произошли, можно было получить из другого объекта?

Вопрос переведен с https://stackoverflow.com/q/13891892/6104996


Ответ

Есть несколько способов сделать это.
Если вы хотите получить значение speed из компонента, который прикреплен к объекту с именем, предположим MyObject
public class SpeedController : MonoBehaviour public float speed; // Для ограничения только на чтение и запретить запись - можно использовать "Свойство"
то в другом компоненте вы можете сделать следующее:
// Найти объект по имени GameObject go = GameObject.Find("MyObject"); // взять его компонент где лежит скорость SpeedController speedController = go.GetComponent(); // взять переменную скорости float courrentSpeed = speedController.speed;
Замечание: если нейдется объект с таким именем или их будет много - то это может привести к плачевнм последствием. Также нужно помнить, что операция Find довольно медленная. И, например, в Update лучшее её не использовать. Лучше найти объект при старте и только потом уже использовать.

Самый при самый неудобный способ (да и, в принципе, неправильный, но действующий) - это объявить переменную speed типа SpeedController в каждом классе. Перетащить в это поле объект в эдиторе. Тогда сможете наблюдать за состоянием переменной в любой момент. Но способ ужасный и не рекомендуемый

Еще способ создать синглтон, который будет содержать вашу переменную speed
public class MyGlobalSpeedController { private static MyGlobalSpeedController instance = null; public static MyGlobalSpeedController SharedInstance { get { if (instance == null) { instance = new MyGlobalSpeedController (); } return instance; } } public float speed; }
Тогда все классы смогут иметь доступ через него:
float currentSpeed = MyGlobalSpeedController.SharedInstance.speed

Еще можно объявить переменную статической и тогда она не будет привязана к объекту, а будет принадлежать классу
public class SpeedController : MonoBehaviour public static float speed;
доступ к ней прост:
var speedVal = SpeedController.speed; Debug.Log(speedVal);
Раз вы пытаетесь сделать так, чтоб она была доступна всем остальным объектам, то, предполагаю, что объект с такой переменной у вас на сцене - один. Иначе этот способ становится бесполезным

Также можно использовать систему сообщений в Unity
Например Component.SendMessage. Он имеет 4 перегруженных метода
public function SendMessage(methodName: string, value: object = null, options: SendMessageOptions = SendMessageOptions.RequireReceiver): void; public function SendMessage(methodName: string, value: object = null, options: SendMessageOptions = SendMessageOptions.RequireReceiver): void; public function SendMessage(methodName: string, value: object = null, options: SendMessageOptions = SendMessageOptions.RequireReceiver): void; public function SendMessage(methodName: string, options: SendMessageOptions): void;
он вызывает метод с именем methodName в каждом MonoBehaviour на этом объекте, например:
go.SendMessage("GetFallingSpeed");
вызовет метод GetFallingSpeed на объекте go. А данный метод (GetFallingSpeed) возможно как раз и будет управлять параметром speed
Не забудьте, что вам нужно получить доступ к go каким-либо образом, т.е. через Find или другим удобным способом.

Ответ переведен с дополнением с https://stackoverflow.com/a/13892844/6104996

Как правильно переименовать проект?

Есть проект A. Его нужно переименовать в проект B
Как правильно нужно переименовать проект и что в нем нужно изменить, чтобы при установке двух apk A и B приложения не затирали друг друга, а были двумя разными приложениями на телефоне?


Ответ

Для начала необходимо открепить объединение средних имен в пакете, для этого нужно выбрать параметры отображения структуры проекта, которая находится над самой текстурой и убрать галочку “Compact Empty Middle Packages”.

Когда имена будут откреплены, каждое из имён можно изменить отдельно. Меняем необходимые имена выбрав из контекстного меню Refactor – > Rename или нажав сочетание клавиш Shift+F6. При появлении предупреждения нажимаем кнопку Rename Package.

При изменении первого имени пакета – com/ru/ua необходимо нажать “Rename all”, так как внутри этой папки расположены паки библиотек, в которых так же необходимо заменить имена. Теперь имя пакета изменено, связи в классах переписаны, но настройки проекта еще не знают что мы что-то сделали. Для оповещения открываем файл с настройками Gradle который называется build.gradle (Module:app), находим в нём следующий участок кода и изменяем имя пакета на новое.
В большинстве случаев Gradle сам определит, что были внесены изменения и предложит синхронизироваться с проектом, показав соответствующее уведомление в правом верхнем углу. Но если этого не произошло - необходимо выполнить синхронизацию вручную. Для этого отправляемся в меню студии Tools –> Android –> Sync Project With Gradle Files . Последнее что осталось сделать, это изменить имя пакета в манифесте, хотя для активностей имена уже будут изменены. Открываем файл манифеста AndroidManifest.xml и в самом верху изменяем имя.
Источник

Если скучно читать, то советую посмотреть видео

Почему вызов m(null) не считается неоднозначным?

public class H1 { public static void main(String[] args) { m(null); } public static void m(Object o) {System.out.println("Object");} public static void m(String s) {System.out.println("String");} //public static void m(Integer i) {System.out.println("Integer");} }
Данный код компилируется и выводит в консоль "String". Вопрос: почему вызов m(null) не считается неоднозначным, ведь если раскоментировать строку с параметром типа Integer неоднозначность появится.


Ответ

Потому что используется правило выбора наиболее подходящего метода (из спецификации - 15.12.2.5. Choosing the Most Specific Method).
В вашем примере для null-аргумента подходят два метода, но класс Object является родительским классом для String, поэтому компилятор останавливается на void m(String s)
Если раскомментировать метод void m(Integer i), то для компилятора оба метода (кроме void m(Object o)) будут наиболее подходящими - отсюда и сообщение об неоднозначности вызова метода.

Нижнее подчеркивание ('_') в C++

Что означает использование нижнего подчеркивания в С++? Речь идет о его индивидуальном использовании, а не в составе переменной и т.п. В частности, пример:
template class VDeleter { public: VDeleter() : VDeleter([](T _) {}) {} ........................................
Заранее спасибо!


Ответ

Есть распространённая практика, не только в C++, давать название _ тем значениям или переменным, к которым не будут обращаться. Эдакое "неважно что", чему давать осмысленное имя нету (кхм) смысла.
Где-то это часть семантики языка, но в C++ это просто переменная со странным названием. Оптимизатор может догадаться выкинуть работу с этим значением, откуда возможно, пока это не влияет на наблюдаемое поведение. Но это никак не относится к названию, компилятор может это сделать с любой другой переменной.
То, что такое название не является "особым случаем" в семантике языка, накладывает несколько неприятных последствий:
невозможность объявить несколько таких в одной области видимости (в одном списке аргументов, например) нестрогость соблюдения (обратиться к такой переменной технически можно)
Почему этот аргумент вообще там должен быть — в каждом случае надо рассматривать отдельно, но случаи бывают.
Простой пример прямо в языке: в C++ чтобы перегрузить постинкремент (i++), нужно перегружать operator++(int). Но в оператор никакой int не передаётся. Зачем он? Чтобы отличить от преинкремента (++i), чья сигнатура operator++()
Вот этот самый "бессмысленный аргумент" и можно назвать _. Чтобы подчеркнуть его бессмысленность.
А в случае C++ (напоминает Harry), чаще можно убрать название вообще, что лишено вышеописанных недостатков.

OpenFileDialog и MVVM

Подскажите, каким правильно пойти путем.
На форме WPF есть кнопка "Обзор", которая должна вызвать OpenFileDialog и после выбора файла передать его имя в textbox
Используя паттерн MVVM, я должен не менять значение textbox, а изменить соответствующие значение в VM. И вот мой вопрос. Вызов OpenFileDialog я должен сделать в VM как ICommand, или из своей формы на которой кнопка?


Ответ

Диалоги-краеугольный камень MVVM ибо предполагается, что VM о View ничего не знает, но должен получать от неё данные. Получаем, что с одной стороны View должна вызывать команды VM с параметрами и VM ну никак не должна работать с отображением. Т.е. диалоги относятся к View. А с другой: View не должна содержать логики/кода, а вызов диалогового окна и получение результата это какая никакая а логика/код.
Самый простой вариант: в коде View повесьте обработчик события на то событие по которому у вас должен отображаться диалог выбора файла в котором создаёте и отображаете диалог пользователю, а по факту успешного закрытия события вызываете команду VM из кода (в этом случае можно обойтись и интерфейсным методом, без объявления команды).
В код на стороне VM Должна приходить строка пути к открываемому файлу(лам) и, возможно, тип доступа (чтение/чтение-запись и тп.)
PS: Если вы придерживаетесь MVVM при разработке, имхо, главное, что следует всегда помнить: вы должны сохранять тестируемость Unit-тестами вашей VM. (т.е. если вместо M подсунуть тестовые данные, а вместо View напрямую вызвать команды у вас все публичные методы и команды должны тестироваться без танцев с бубном) Создание в VM диалогов ломает эту схему.
Вариант посложнее: Иногда случается так, что диалог нужен кастомный. С кучей параметров которые должны задаваться на уровне VM. И вообще возможно так, что въюха должна контролировать диалог (т.е. например сначала отобразить его, а потом начать перемещать его по экрану, а потом ещё что-то эдакое) В этом случае возможно воспользоваться делегатами которые вы определяете на уровне VM. Входные и выходные параметры вы определяете так же в VM. Присвоение метода делегату осуществляется в коде который относится ко View. В нем реализуется отображение диалога (или чего бы то ни было ещё) и логика поведения/управления отображением. На выход вы, в принципе, можете передавать всё что угодно, начиная от результата диалога и заканчивая объектом реализующим объявленный вами интерфейс через который вы контролируете окно. Этот вариант по коду выходит чуть компактнее варианта с интерфейсами. Тестируемость не страдает.
PSS: Имхо, "правильного" варианта вне глобального контекста задачи не существует. Помните, что "Hello World" написанный по всем канонам и стандартам это овер 100 строк кода. Варианты с интерфейсами/делегатами и пр. танцами с бубном и десятком сопутствующих классов специфичны, сложны в понимании, сопровождении и отладке (!) и нужны только в случае если у вас этих диалогов (разных видов) больше 3 и ожидаются ещё в будущем к тому же они все нестандартные и со сложным поведением. В общем "Не усложняйте" (с)

Ромб в консоли с помощью javascript

Пытаюсь вывести ромб в консоли таким способом:
var i, j, size = 10, board = '', mboard = ''; for(i = 0; i< size/2; i++){ board += '#'; console.log(board); } for(j = size/2; j > 0; j--){ mboard += '#'; console.log(mboard); }
и не могу понять как подправить код, чтобы выводился именно ромб?
Должно бы быть вот как:
* * * * * * * * *
Или хотя бы так:
* ** *** ** *
понять бы алгоритм.


Ответ

Решение простейшее.
var s, i, j, size = 10, board = '', out = ''; for (s = 0; s< (size/2)-1; s++){ out += ' '; } for(i = 0; i< size/2; i++){ board += '# '; console.log(out, board); out = out.substring(0, out.length - 1); } for(j = size/2; j > 0; j--){ out += ' '; board = board.substring(0, board.length - 2); console.log(out, board); }

Можно ли сделать с помощью css такую анимацию?


Можно ли с помощью CSS сделать такую анимацию, чтобы некую выпуклость превратить в вогнутость ? Если да, то с помощью чего ?


Ответ

Решение SVG
Реализовать кривую такой формы проще всего с помощью Кривых Безье второго порядка.

Из рисунка выше видно, что можно получить последовательные кадры анимации, как у автора вопроса. Для этого надо изменять у параметра Q координаты x1 и y1
Итак пишем несколько формул для нескольких патчей, составленных из квадратичных кривых Безье. Теория здесь.

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

Анимацию осуществляет команда
animate attributeName="d" dur="2s" repeatCount="3"
в параметр values="M100,100 Q204,200 297,100;M100,100 Q204,167 297,100;
добавлены через точку с запятой все промежуточные положения квадратичной кривой Безье.
Ещё один пример анимации квадратичных кривых Безье.

Зачем нужны inner классы в интерфейсах в Java?

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


Ответ

Пробежался структурным поиском по своему CLASSPATH и выловил следующие примеры:
Интерфейс как пространство имен
Самое частое - статический еnum, связнанный предметной областью с интерфейсом, объявленный внутри интерфейса. Интерфейс в данном случае играет роль пространства имен.
public interface Foo { void foo(Bar bar);
static enum Bar { BAR1, BAR2, BAR3 } }
Пример:
com.google.common.util.concurrent.Service

Похожий вариант - класс, описывающий value-тип, связанный с интерфейсом.
public interface Foo { void foo(Bar bar);
static class Bar { private final String id; public Bar(Sting id) { this.id = id; } public String getId() { return id; } } }
Пример:
org.hibernate.persister.entity.Queryable io.undertow.security.api.AuthenticationMechanism

Несколько маленьких классов внутри интерфейса реализующих другой очень узкий интерфейс. Интерфейс используется только как пространство имен.
public interface Convertor { String convert(Object arg); }
public interface Convertors { static class Convertor1 implements Convertor { String convert(Object arg) { /* ... */ }} static class Convertor2 implements Convertor { String convert(Object arg) { /* ... */ }} static class Convertor3 implements Convertor { String convert(Object arg) { /* ... */ }} }
Пример:
org.hibernate.tuple.TimestampGenerators

Исключение, связанное с интерфейсом.
public interface Foo { void foo() throws BarException;
static class BarException extends Exception { // ... } }
Пример:
org.hibernate.boot.spi.InFlightMetadataCollector

Интерфейс объявляет внутри себя вспомогательные helper-классы с логикой, которые предлагает использовать реализациям.
Пример:
org.eclipse.jetty.io.ByteBufferPool com.mysql.jdbc.SocketMetadata (5.1.39)

Интерфейс объявляет внутри себя готовую реализацию-заглушку.
public interface Foo { Bar foo();
static class FooImpl implements Foo { @Override public void foo() { return null; } } }
Пример:
org.junit.Test com.codahale.metrics.MetricRegistryListener

Интерфейс объявляет внутри себя Singleton, потому что "почему бы и нет": и так антипаттерн, так хоть локализовать его.
Пример:
org.asynchttpclient.channel.ChannelPoolPartitioning

Аннотация + обработчик
Статический класс реализующий некий интерфейс внутри интерфейса-аннотации описывающий логику этой аннотации. Код, анализирующий аннотации скорее всего доберется до этого статического класса через рефлексию.
@Retention(RetentionPolicy.RUNTIME) public @interface Foo { // annotation fields
static class FooHandler implements Handler { public void handle(Foo foo, Object arg) { //... } } }
public interface Handler { void handle(A a, Object arg); }
Примеры:
javax.annotation.RegEx javax.annotation.Nonnull javax.annotation.Nonnegative

Ключевое слово This и его применение в Классе\Пользовательской структуре

Я заметил,что семантика работы ключевого слова "this" в пользовательских структурах и классах,кардинально отличается. К примеру,в структуре мы можем сделать что то подобное :
struct MyStruct { int x,y;
void Reset() { this = new MyStruct(); // удаляем предыдущую структуру и создаем новую О_О } }
Хотелось бы увидеть всю разницу ключевого слова This, между структурой и классом,а так же узнать, что там твориться под капотом.


Ответ

Самое главное различие состоит в том, что переменная this для структурного типа должна быть явно присвоенной в конструкторе структуры.
Переменная структурного типа, а this для структур является переменной структурного типа, считается явно присвоенной , если каждое из ее полей является явно присвоенным
Как это сказывается на структурах?
Это сказывается на работе конструкторов. Рассмотрите следующий пример объявления структуры
struct EvenOdd { int x, y; void make_even() { x &= ~0 << 1; }
void make_odd() { y |= 1; }
public EvenOdd( int x, int y ) { this.x = x; make_even(); this.y = y; make_odd(); } }
Для этого объявления структуры компилятор выдаст сообщение об ошибке,
Ошибка CS0188 Невозможно использовать объект this, пока не будут назначены все его поля.
потому что в точке вызова метода make_even this еще не является явно присвоенной, так как член данных структуры y еще не был инициализирован.
После выхода из конструктора переменная this считается явно присвоенной
Вы можете сделать предыдущий конструктор структуры валидным посредством предварительного вызова конструктора по умолчанию
public EvenOdd( int x, int y ) : this() { this.x = x; make_even(); this.y = y; make_odd(); }
В этом случае внутри тела конструктора с параметрами переменная this уже будет явно присвоенной
Если же вы измените это объявление на объявление класса, то никаких проблем с this, где this уже не переменная, а значение, не будет, и данный класс будет успешно компилироваться.
class EvenOdd { int x, y; void make_even() { x &= ~0 << 1; }
void make_odd() { y |= 1; }
public EvenOdd( int x, int y ) { this.x = x; make_even(); this.y = y; make_odd(); } }

Как найти самую длинную строку в List?

Подскажите, пожалуйста, способ нахождения самой длинной строки в ArrayList.


Ответ

Собссн банальный цикл и сравнение значения с предыдущем вполне спасёт:
ArrayList Str = new ArrayList(); Str.add("Jim Bob"); Str.add("Bobby Jones"); Str.add("Rob Stiles");
int largestString = Str.get(0).length(); int index = 0;
for(int i = 0; i < Str.size(); i++) { if(Str.get(i).length() > largestString) { largestString = Str.get(i).length(); index = i; } }
System.out.println("Index " + index + " "+ Str.get(index) + " " + "is the largest and is size " + largestString);

Вариант с Java8 (использовать java.util.Collections.max)
String max = Collections.max(StrList, Comparator.comparing(s -> s.length()));

Еще вариант с Collections, но до Java8
String max = Collections.max(Str, new Comparator() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } });
System.out.println(max);
Collections.max - принимает на вход коллекцию (в данном случае строк) и компаратор, в котором должна быть описана логика сравнения элементов коллекции.

Подскажите несколько несложных алгоритмов хэширования строк

Опишите пару алгоритмов для хэширования строк. Если есть, то с кодом на java или pascal.


Ответ

Пожалуйста, открываем исходники класса java.lang.String, находим там метод hashCode
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value;
for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }

Проверяемые исключения

Пусть есть метод, который может бросить проверяемое исключение при некорректных входных параметрах
void throwMethod(int count) throws MyException { if (count < 0) throw new MyException(...); ....... }
и есть вызывающий метод, который передает гарантировано правильный параметр
void callMethod() { int count = 15; throwMethod(count); }
Компилятор говорит, что callMethod должен декларировать возможность возникновения исключения MyException. Т.е. у меня есть два пути: либо задекларировать это
void callMethod() throws MyException { int count = 15; throwMethod(count); }
либо поймать его
void callMethod() { int count = 15; try { throwMethod(count); } catch (MyException e) {} }
первый вариант мне не нравится, т.к. декларируется событие, которое никогда не произойдет. Во втором варианте закапываются грабли, которые могут всплыть при рефакторинге. Скажем, в методе throwMethod усилится проверка
void throwMethod(int count) throws MyException { if (count < 0 && count > 10) throw new MyException(...); ....... }
или вызываемый метод перепишется
void callMethod() { int count = 15 - List.count; try { throwMethod(count); } catch (MyException e) {} }
тогда исключение потеряется и ошибку придется искать долго. Ну и кроме того, у меня стабильное отвращение перед пустой catch секцией.
Есть еще мысль, выбросить непроверяемое исключение
void callMethod() { int count = 15; try { throwMethod(count); } catch (MyException e) { throw new RuntimeException(e); } }
Тогда если сейчас исключений не может быть, тогда и RuntimeException не будет. А если что-то поменяется, то хоть ошибку увидим. Но это попахивает каким-то костылем.
Вопрос - как делать правильно?
UPDATE
Вопрос возник по мотивам конструктора класса URL(String), который может бросить MalformedURLException если в строке не указан протокол, указан неизвестный протокол или передан null. И я создаю объект кодом
URL url = new URL('http://google.com/');


Ответ

} catch (MyException e) { throw new RuntimeException(e); }
Так делать не красиво. Если вы допускаете что исключение лучше сделать рантайм, то сделайте свое исключение, которое будет расширять RuntimeException
} catch (MyException e) {}
Так делать определенно очень, очень плохо. Как вы правильно рассуждали, могут быть трудновыловимые баги. Так что, по моему опыту, лучше уж кропотливо обрабатывать все ошибки, даже если вам кажется что они возникнуть не могут. Ну тут я бы сделал примерно так:
void callMethod() throws MyException {/* ... */}
А уже в методе, который делает ряд вычислений, включая вызов callMethod(), я бы сделал ряд блоков try/catch, в которых бы обрабатывались разные варинты исключительных ситуаций. примерно так:
try { /* ряд методов и вычсилений */ } catch (MyException1 e1) { //обработка одного из исключений } catch (MyException me) { //обработка вашего исключения. } catch (Exception e) { //на всякий случай, если произойдет совсем неожиданное исключение }

Где находится boot.ini windows 10/2016

Хочу отредактировать файл boot.ini на сервере windows 2016(или windows 10), не могу его найти, обычно он должен лежать на диске C:\ (в более поздних версиях). команда в cmd:
bootcfg /query ERROR: Cannot open BOOT.INI file.
По умолчанию этого файла нет, если его просто создать по адресу C:\boot.ini. файл игнорируется, видимо это пережиток windows xp.
Где находится и как называется данный файл?


Ответ

Нигде не находится и никак не называется.
См. справку по BCDEdit

Почему this в onclick необязателен?

Почему в onclick работает innerHTML^=1, хотя по идее должно быть this.innerHTML^=1?
/* ignore css */ p { float: left; font-size: 4em; width: 2em; line-height: 2em; border: 1px solid; text-align: center; margin: 0; cursor: pointer; background: silver; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } p + p { margin-left: .125em; }

0

0


Ответ

Внутренний сырой неоткомпилированный обработчик это тупль со следующей информацией:
Неоткомпилированное тело скрипта Место происхождения тела скрипта, если необходимо сообщить об ошибке
Когда пользовательский агент(ПА) получает текущее значение обработчика события H, он должен выполнить эти шаги:
Если значение H – внутренний сырой неоткомпилированный обработчик, выполнить эти подшаги:
Если H это обработчик события элемента, то пусть element это элемент, а document – Document элемента.
Иначе, H это обработчик события объекта Window: пусть element будет null, и пусть document это Document, ассоциированный самым последним с этим Window-объектом. Если document – не в контексте браузинга, или если скриптинг включён для контекст браузинга document'а, тогда возвратить null и прервать алгоритм получения текущего значения обработчика события. Пусть body это неоткомпилированное тело скрипта во внутреннем сыром неоткомпилированном обработчике. Пусть location это место, из которого происходит тело скрипта, как задано внутренним сырым неоткомпилированным обработчиком. Если element – не null и element имеет владельца формы, пусть form owner это владелец формы. Иначе – пусть form owner будет null. Пусть script settings это объект настроек скрипта, созданный для объекта Window, с которым document в настоящее время ассоциирован. Получить окружение выполнения скрипта для JavaScript из script settings Если body не разбирабельно как FunctionBody, или если при парсинге выявляется ошибка early error, тогда следовать этим подшагам:
Установить H со значением null. Сообщить об ошибке для соответствующего script со соответствующей позицией (номер строки и номер столбца), заданной в location, используя глобальный объект, специфицированный в script settings, в качестве цели. Если ошибка по-прежнему не обработана после этого, тогда о ней можно сообщить пользователю. Перескочить ниже на шаг end.
Примечание: FunctionBody определена в ECMAScript edition 5 section 13 Function Definition. Ошибка Early error определена в ECMAScript edition 5 section 16 Errors. [ECMA262] Если body начинается с Directive Prologue, содержащего Use Strict Directive, тогда пусть strict будет true, иначе – пусть strict будет false.
Примечание: Термины "Directive Prologue" и "Use Strict Directive" определены в ECMAScript edition 5 section 14.1 Directive Prologues and the Use Strict Directive. [ECMA262] Используя окружение выполнения скрипта, полученное выше, создать объект функции (как определено в ECMAScript edition 5 section 13.2 Creating Function Objects), с:
Списком параметров FormalParameterList
Если H это обработчик события onerror объекта Window
Пусть функция имеет 5 аргументов: event, source, lineno, colno и error Иначе:
Пусть функция имеет один аргумент event Тело функции FunctionBody:
Результат парсинга body выше. Лексическое окружение Scope
Пусть Scope это результат NewObjectEnvironment(document, global environment). Если form owner не null, пусть Scope это результат NewObjectEnvironment(>form owner, Scope). Если element не null, пусть Scope это результат NewObjectEnvironment(element, Scope).
Примечание: NewObjectEnvironment() определена в ECMAScript edition 5 section 10.2.2.3 NewObjectEnvironment (O, E). [ECMA262] Булев флаг Strict
Значение strict Пусть function это данная новая функция. Пусть script это новый скрипт. Пусть кодовой точкой входа script'а будет function Пусть объектом настроек script'а будет script settings Установить H в function End: Возвратить значение H.

Верстка блока и рисование на CSS

Всем здравствуйте! У меня такой вопрос, как лучше сверстать вот такой блок? Стрелки навигации, логотип и список рядом. Выглядит это более,менее сейчас, как на картинке. Но это внешняя красота :) Меня смущает, что вставлять картинки стрелок - это не очень хороший вариант. Можно ли их нарисовать на CSS? Или есть другие лучшие варианты?
Я это реализовала сейчас таким образом
HTML

  • Администрация
  • Документы
  • Правоохранительные органы
  • Здоровье
  • Образование
  • Торговые центры
  • Аварийные службы

CSS
.logo_raion { display: inline-block; margin-right: 30px; vertical-align: center; } .raion_nav { display: inline-block; font-family: FRAMDCN; font-weight:400; font-size:2em; padding: 25px 0 0 0; } .raion_nav li { margin-top: 15px; }


Ответ

Псевдоэлементы + трансформации + линейный градиент. Плюс метода в том, что размер стрелок надо менять в одном месте и не подгонять под новые размеры кучу свойств.
.content { display: inline-block; vertical-align: top; width: 200px; } .left, .right { position: relative; width: 30px; height: 70px; display: inline-block; vertical-align: top; } .left:before, .right:before, .left:after, .right:after { position: absolute; content: ''; width: 40%; height: 50%; background-image: linear-gradient(to right, #ccc 0%,#ccc 15%,#fff 30%,#fff 70%,#ccc 85%,#ccc 100%); transform-origin: 0 0; transform: skewX(28deg); } .right:after { transform: skewX(-28deg); transform-origin: 100% 100%; top: 50%; } .left:before { transform-origin: 0 100%; transform: skewX(-28deg); } .left:after { top: 50%; }


Вращение или поворот изображения при наведении

Я хочу узнать, как сделать вращающееся изображение, когда на него наводится курсор. Хотелось бы понять, как реализовать эту функциональность с помощью CSS и следующего кода:
img { border-radius: 50%; }
Перевод вопроса: Spin or rotate an image on hover


Ответ

Вы можете использовать transitions CSS3 для вращения изображения при наведении.
Rotating image :
img { border-radius: 50%; -webkit-transition: -webkit-transform .8s ease-in-out; transition: transform .8s ease-in-out; } img:hover { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
Дополнительная информация и ссылки:
Руководство по transitions CSS на MDN Руководство по transforms CSS на MDN Таблица поддержки браузера для 2d-transforms на caniuse.com Таблица поддержки браузера для transitions на caniuse.com
Перевод ответа: Spin or rotate an image on hover @web-tiki

Странный синтаксис С++ кода в библиотеке LuaBind

Заинтересовался либой LuaBind. Читаю доку, разбираю примеры. И тут попался странный хлоуворлд:
#include #include
void greet() { std::cout << "hello world!
"; }
extern "C" int init(lua_State* L) { using namespace luabind;
open(L);
module(L) // Что это за конструкция такая? [ // def("greet", &greet) // ]; //
return 0; }
Код вроде бы С++, но то, что я выделил комментами ... не пойму. Что это? Собственно в этом вопрос.


Ответ

Ну вот, например, набор определений на самом что ни на есть базовом языке С (!), который позволит вам написать ту же самую конструкцию
const int L = 42; void greet(void) {} int *module(int i) { static int a[1] = { 0 }; return a; } int def(const char *c, void f(void)) { return 0; }
int main() { module(L) [ def("greet", &greet) ]; }
Что говорит о том, что данная конструкция использует самый базовый синтаксис языка и ничего необычного в ней нет.
Семантика этой конструкции в Lua будет, конечно, более богатой из-за использования перегруженных операторов, но использованный тут синтаксис - банален.

C#: в чем разница между readonly и const?

Привет всем! В C# есть const и readonly. В сети нашел только информацию о разнице static readonly и const. А какая разница между просто readonly и const?


Ответ

Значения полей с модификатором const при компиляции подставляются в тех местах кода, где к ним происходит обращение. Это значит, что в случае, когда такое поле объявлено в классе одной сборки, а используется классами другой сборки, для того чтобы измененное значение было применено в зависимой сборке, потребуется перекомпиляция зависимой сборки. Задать значение можно только в момент объявления. В общем то const-поля это не совсем поля.
Поля с модификатором readonly являются полноценными полями, с той разницей, что изменять их значение разрешено только в конструкторе. Соответственно static readonly - в статическом конструкторе (код инициализации полей при объявлении переносится в конструктор компилятором). Таким образом, значения readonly-полей могут, например вычисляться на основе параметров переданных в конструктор, что невозможно для const-полей.
В большинстве случаев рекомендуется использовать именно readonly-поля вместо const-полей когда ваш проект включает более одного модуля.
А еще у нас тут есть шикарный список литературы рекомендуемой к прочтению для изучения C# и .NET. Книги в списке условно разделены по уровню сложности. Большую часть из них можно найти в сети в электронном виде, было бы желание. Так уж получается, что без чтения книжек программисту не обойтись.

Visual Studio 2017 на Windows 7

Собрался изучать C# по книге. В книге не рассказывалось как и что настраивать. Зашел сам скачал бесплатную версию Visual Studio Community 2017 с официального сайта. После установки указал C#. У компоненты указанные по умолчанию. У меня Windows 7/
Теперь запускаю мне нужно выбрать шаблон Console App. Его там не было, нашел что можно создать через простой "пустой" шаблон. В конце концов оказалось что пакеты SDK установлены только для Windows 10 и создать шаблон проекта не возможно. Зашел в установку компонентов, там вообще нету для Windows 7.
Что мне делать, как работать с Windows 7?
Не много бомбануло от того что я же качал с Windows 7, качал версию для учащихся студентов и так далее. И это среда разработанная именно для той ОС на которой я сижу не могла автоматом определить или чего подсказать что вот вы ставите на семерку значит вам мы предложим установить такие то файлы и компоненты, ибо у вас не запустится Windows SDK 10. Но нет там по умолчанию было сказано установить это и то и в итоге нельзя нечего разработать. Это как если бы я зашел с макбука и установил с AppStore какое-нибудь приложение для Windows 8 причем успешно с инструкциями что нажать туда сюда, а при запуске сказало что нет вы не можете его использовать здесь!


Ответ

Запустите Visual Studio Installer. Под Visual Studio Community 2017 три кнопки - обновить, запустить и дополнительное меню (три горизонтальных полоски). Выберите дополнительное меню, в нём выберите пункт "Изменить". В открывшемся окне выберите те шаблоны, которые Вам нужны.

Запуск *.exe, который находится на шаре

Сценарий:
Допустим, на некоторой шаре лежит какой-то *.exe файл.
Из своей программы я запускаю командную строку, где запускаю данный *.exe с передачей аргументов.
*.exe делает какую-то работу и закрывается и так N-раз.
Вопрос в том:
При каждом обращении к *.exe я его буду "скачивать" в ОЗУ по новой или ОС его закеширует?


Ответ

Любопытно, потестировал у себя в сети, вот что получил:
При обычном запуске *.exe из сетевой папки его кеширования не происходит Однако, если запущенная программа уже есть в памяти (висит как процесс) — файл не гоняется по сети при запуске второго экземпляра. Причём это работает, даже если запускать тот же файл, но с другими параметрами.
Как вывод — очевидный костыль: запустить одну копию программы, чтобы она висела в памяти, и последующие копии не гонялись по сети. При необходимости воспользоваться приостановкой процесса или даже запуском под отладчиком, если программа имеет тенденцию самостоятельно закрываться слишком быстро.
А теперь перейдём к нормальному решению. В Windows встроен механизм автономных файлов, позволяющий работать с сетевыми папками без доступа к сети (т.е. механизм кеширования). Настраиваться он может с обеих сторон.
1) Владелец сетевой папки может:
Разрешить кеширование (по умолчанию); Полностью запретить кеширование; Сделать его принудительным для всех открываемых сетевым пользователем файлов.
Настраивается это так: Компьютер → Управление → Общие папки → Общие ресурсы → Свойства → Настройка автономного режима
2) Со стороны пользователя можно:
В проводнике выбрать нужный файл и в контекстном меню поставить галочку на пункте «Всегда доступно автономно»
Централизованное управление всеми файлами, для которых настроен автономный доступ, есть в Панели Управления, в разделе Центр Синхронизации → Автономные файлы

Сумма двумерного массива через рекурсию

Здравствуйте, сегодня столкнулся с такой вот задачей:
Дан двумерный массив с числами. Найдите сумму элементов этого массива используя рекурсию и не используя цикл.
Смог решить только данным способом игнорируя условия задачи (не закомиченное решение простой перебор с сложением, если через рекурсию то первая функция превращает двумерный массив в одномерный и из него уже считается сумма через рекурсию):
var arr = [1, 2, [3, 4]], result = 0, //при рекурсии меняется на array sumArr = 0; function newArr(arr) { for (var i = arr.length; i--;) { if (typeof(arr[i]) == 'number') { //result.push(arr[i]); result += +arr[i]; } for (var j = arr.length; j--;) { if (typeof(arr[i][j]) == 'number') { //result.push(arr[i][j]); result += +arr[i][j]; } } } } newArr(arr); console.log(result); /*function sum (result){ if(result.length > 0){ sumArr += result[0]; result.shift(); sum(result); } } sum(result); console.log(sumArr);*/
Есть способ решить данную задачу не нарушая условий полностью через рекурсию без использования циклов?


Ответ

Сделал без использования циклов вообще.
var test = [1, 1, 1, [1, 1, [1, [1, [ [1], [1] ]], 1], 1], 1]; function arrSum(array, i = 0) { if (isFinite(array)) return Number(array); else if (typeof array == "object" && i < array.length) // верно только если array - массив (имеет свойство length) return arrSum(array[i]) + arrSum(array, i + 1); return 0; } console.log(arrSum(test));