Страницы

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

понедельник, 24 декабря 2018 г.

Как задать структуру выходного проекта?

По умолчанию VS при компиляции кладет все в одну директорию рядом с EXE.
Т.е и сборки и все остальное лежат в одной папке.
Как создать свою собственную структуру?
Например, я хочу, что бы одни сборки клались в одну папку, другие в другую, а в корне был EXE.


Ответ

Ну это как бы можно
Для начала, вы добавляете каталоги, в которых будут лежать ваши библиотеки, в assembly probing path. Для этого отредактируйте ваш app.config, добавьте в него следующее:

(Документация.)
Затем, в свойствах проекта в зависимостях укажите CopyLocal = False:

Затем, в свойствах проекта-библиотеки установите Output Path в каталог, где вы хотите получить эту DLL (для каждого из ваших target platform/processor):

Ну или в post-build step каждого из зависимых проектов укажите вручную копирование куда надо.
Всё, должно работать.

Как советует @Andrew B в комментариях, существует ещё один путь, описанный в документации: подписаться на событие AssemblyResolve, которое отправляется, если .NET не может загрузить сборку из вашего каталога.
Для этого нужен код наподобие такого:
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
где метод OnAssemblyResolve определён так:
Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { var name = args.Name.Substring(0, args.Name.IndexOf(","));
// проверка на то, есть ли загружаемая сборка среди наших статических ссылок // взята из https://support.microsoft.com/ru-ru/kb/837908 // но вам может быть и не нужна, подумайте сами if (!Assembly.GetExecutingAssembly().GetReferencedAssemblies() .Any(asmName => asmName.FullName.Substring(0, asmName.FullName.IndexOf(",")) == name)) { // это не assembly из наших ссылок return null; }
var applicationDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); foreach (var subfolder in new[] { @"some\subfolder", @"another\subfolder" }) { var path = Path.Combine(applicationDir, subfolder, name + ".dll"; if (File.Exists(path)) return Assembly.LoadFrom(path); }
return null; }
(Не тестировал.)
Достоинство этого решения — то, что список путей можно изменять динамически, если это вдруг понадобилось.
Недостаток — то, что у вас некоторые сборки будут грузиться в assembly binding-контексте LoadFrom в отличие от обычной загрузки в контексте Load. Типы, загруженные в таком контексте, будут несовместимы с типами, загруженными в обычном контексте. Особенно это может «клюнуть», если у вас в разных местах лежат разные версии одной и той же сборки. [Это может привести к эффекту, когда один и тот же статический класс существует в двух экземплярах.] Будьте осторожны и готовы к неожиданностям! (Вопрос также обсуждался здесь.)
Если ваши сборки приходят с ресурсами, возможно, вам нужно учесть эту модификацию
Дополнительное чтение по теме assembly binding/load context:
Best Practices for Assembly Loading Suzanne Cook, LoadFile vs. LoadFrom

Для автоматического копирования сборок в целевые каталоги посредством MSBuild посмотрите ответы к этому вопросу
Но в целом, я бы порекомендовал воспользоваться советом @TomTom и не заморачиваться, а оставить всё как есть. То, что файлы лежат в одном каталоге, пользователь не увидит, если вы правильным образом поместите ярлыки в системное меню при инсталляции (а вы в любом случае должны это сделать).

Как сменить цвет текста в toolbar?

У меня отдельный XML-файл с toolbar и как мне поменять в нем цвет текста(Label)?


Ответ

В разметку ToolBar добавьте атрибут:
app:titleTextColor="@color/your_color"

Как изменять нужные данные в базе данных?

Всем привет! Прошу прощения за глупую формулировку вопроса! Не придумал лучше. Тяжело описать вопрос поэтому я его нарисовал) Надеюсь поймете! Коротко: Что бы сделать товар нужно выполнить определенное количество операций по определенной цене. Операции могут меняться и цены на них тоже! И поэтому надо как то запоминать для каждого заказного товара эту информацию, что бы можно было посчитать зарплату себестоимость и та далее.
Я пока что вижу только одно решение хранить для каждого товара в каждом заказе операции. Как бы проблем нет, но за какое то время количество строк будет просто огромным!

Надеюсь вы меня поняли! Что вы посоветуете?


Ответ

Таблицу операций предлагаю сделать с следующей структурой:
Операции товаров { ID-записи, ID-товара, ID-операции, если есть справочник типовых операций или ее название и т.п. цена операции, Дата начала действия, Дата окончания действия (01.01.3000 для самых последних операций/расценок) }
В таблице заказов или еще где нибудь храните дату изготовления, т.е. дату на которую берется перечень операций/цен. Необходимый набор операций в любых расчетах берется как ДатаИзготовления between ДатаНачала and ДатаОкончания. При изменении расценки на конкретную операцию с 12.01.2016 в старой записи ставится дата окончания 11.01.2016 и добавляется такая же запись с датой начала 12.01 и окончания 01.01.3000. Если операция более не выполняется, то только меняется дата у старой записи.
Таким образом с одной стороны у вас хранится вся история изменения операций/цен и вы можете посчитать что угодно. С другой стороны вам не надо к каждому заказу хранить полный перечень всех выполненных действий.
Если по какой то причине ценообразование более сложное и даты начала действия не достаточно, то можно ввести таблицу "Версии цен", где каждой версии будет назначен ID и под версию храните перечень операций, а в заказе тогда фиксируете, что N экземпляров товара изготовлено по версии цен такой то.
P.S. Еще один плюс такой схемы хранения: вы можете заранее вносить в систему "цены, которые начнут действовать через месяц". Работающим с системой не придется срочно, в авральном режиме вносить цены в последнюю минуту.
Из минусов: логика немного сложнее из за дат. Возможно стоит реализовать триггер или другие методы контроля, которые не позволят поставить дату окончания действия расценки меньшую, чем уже есть в учтенных заказах с данным товаром. Хотя можно ограничится правилом, что дату окончания нельзя поставить меньше текущей.

Обычный get-запрос на Java

В Python есть оличная функция для get-запросов, с помощью которой можно получить быстро статус и контент:
response = requests.get(url) print response.status_code print response.content
При попытке загуглить get запрос в Java попадаю на разные инструкции как создать сокет, потом установить соединение и так далее. Неужели в Java нет каких-нибудь простых способов без изобретения собственных велосипедов ?


Ответ

Get-запрос можно осуществить, например, так:
String url = "http://www.google.com/";
URL obj = new URL(url); HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
connection.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close();
System.out.println(response.toString());

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

> public void add(Item item) {
> if (!item.header.equals(null)) {
> this.items[this.index] = item;
> this.index++;
> } else {
> System.out.println("Please header enter.");
> } }
хочу добавить тест на
} else {
System.out.println("Please header enter.");
используя конструкцию
assertThat(???, is(???));
Но что сюда подставлять если у меня консольное приложение? А метод void?


Ответ

Не завязывайте приложение на логирование в консоль. Используйте отдельный объект-логгер, которому будуте передавать строку и уровень логирования. Это стандарт, так делается во множестве крупных проектов.
Приложения работают на серверах, там некому пялиться в монитор и читать логи, поэтому сообщения пишутся туда, куда удобно разработчикам и админам — в файл, в сокет, отправляются по http, что угодно ещё. Могут и в stdout, как в вашем случае, но должен быть выбор. И если в stdout, то System.out.println находится в коде логгера, а не в том месте, где происходит логирование.
И когда вам нужно будет протестировать логгер, вы просто подсунете вместо него тестовый объект, в котором будете проверять, что такой-то метод с такой-то строкой был вызван.
Уже есть множество написанных логгеров, я когда-то использовал log4j, но не могу сравнить с другими.

Запрет на многократный вызов события при действиях с мышью

Всем доброго времени суток!
Пишу собственный GUI-интерфейс для игрушки.
Класс Button
Имеется следующий набор событий-делегатов:
public event EventHandler MouseUpHandler; public event EventHandler MouseDownHandler; public event EventHandler MouseOutHandler; public event EventHandler MouseInHandler;
Каждому из событию соответствует свой метод:
private void OnMouseIn() {...} private void OnMouseOut() {...} private void OnMouseUp() {...} private void OnMouseDown() {...}
В них выполняется примерно такой код:
private void OnMouseDown() { EventHandler tempHandler = MouseDownHandler; // получаем делегат события if (tempHandler != null) // проверяем, не пустой ли делегат { tempHandler(this, EventArgs.Empty); // вызываем событие } _state = ButtonState.Click; // используется для определения правильных координат на спрайте текстуры кнопки во время ее рисования }
Соответствующие методы присутствуют для других событий-делегатов. В этом же классе присутствует метод Update(), который просчитывает логику кода:
public void Update() { /* Формируем данные о положении мыши и о зоне пересечения (на основе позиции и размеров кнопки) */ MouseState mouseState = Mouse.GetState(); Point mousePosition = new Point(mouseState.X, mouseState.Y);
Rectangle buttonRectangle = new Rectangle ( (int) this.Position.X, (int) this.Position.Y, (int) this.Size.X, (int) this.Size.Y );
if (buttonRectangle.Contains(mousePosition)) // проверяем на наличие пересечения курсора мыши и кнопки { if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed) //ЛКМ - нажатие кнопки мыши { OnMouseDown(); } if (_mousePrevState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed && mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Released) // ЛКМ - отпускание кнопки мыши { OnMouseUp(); } } else // выход курсора за границы кнопки { OnMouseOut(); } _mousePrevState = mouseState; // сохраняем предыдущее состояние (MouseUp может быть только после MouseDown) }
В другом месте создается экземпляр кнопки:
Button button = new Button(...);
Соответственно задаются свойства, текстуры и т.д. Все это функционирует. Далее, в том же "другом месте", делегату присваивается метод:
button.MouseInHandler += Название_метода;
С этим, думаю, все должно быть понятно. Логика вкратце - создается объект, ему в специальный делегат присваивается метод, после чего в методе Update() проверяется, было ли пересечение кнопки и курсора, был ли клик и т.д. и на основе этого уже вызывается нужное нам событие.
Проблема, которая имеется сейчас: метод вызывается не единожды, а множество раз подряд.
Все это приводит к тому, что, например, вывод в консоль любого текста происходит множество раз, но требуется не более одного.
Я попробовал решить проблему с помощью дополнительных полей:
private bool _isMouseUp; private bool _isMouseDown; private bool _isMouseIn; private bool _isMouseOut;
С изменением структуры логики методов-событий:
private void OnMouseIn() { if (!_isMouseIn) // если событие не вызывалось { EventHandler tempHandler = MouseInHandler; if (tempHandler != null) { tempHandler(this, EventArgs.Empty); } _isMouseIn = true; // определяем событие, как вызванное и не даем ему совершиться повторно _isMouseOut = false; // после In события можно допустить выполнение Out события } _state = ButtonState.Hover; } // примерно такой же код ниже, разве что теперь Out и In поменялись местами private void OnMouseOut() { if (!_isMouseOut) { EventHandler tempHandler = MouseOutHandler; if (tempHandler != null) { tempHandler(this, EventArgs.Empty); } _isMouseOut = true; _isMouseIn = false; } _state = ButtonState.Normal; }
Для MouseDown и MouseUp соответствующие изменения.
И все это работает, до тех пор, пока пользователь ведет себя нормально. Однако если пробовать различные ситуации, например, зажать ЛКМ, после чего навести на кнопку и отпустить, или зажать ЛКМ над кнопкой и отпустить ее в другом месте - все это приводит к тому, что в какой-либо момент то или иное событие, которое должно было быть вызвано - не вызывается, либо наоборот, вызывается то событие, которые вызываться не должно.
Я попробовал как можно более подробно описать свою проблему, но если будут какие-нибудь вопросы - задавайте, уточню, если нужно.


Ответ

Обычно для UI-элементов вводят понятие Capture.
Когда происходит событие MouseDown, текущий элемент под мышью фиксируется. Эта фиксация и называется capture. После этого все события о перемещении мыши доставляются только этому элементу. При этом событие отпускания мыши тянет за собой автогенерацию клика только если при этом мышь была внутри элемента с capture. После отпускания мыши capture обнуляется.
Таким образом исчезают неожиданные комбинации событий. Вы можете проверить работу capture на окне какого-нибудь приложения: нажмите на крестик закрытия окна в правом верхнем углу, и, не отпуская кнопку мыши, уведите её из кнопки. Теперь отпустите мышь, крестик не сработает.

Кстати, у вас в коде логическая ошибка: для MouseDown нужно проверять предыдущее состояние точно так же, как вы делаете для MouseUp: MouseDown происходит только если предыдущее состоянии мыши было ненажатым.

Как сделать скошенные углы с помощью css?

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


Ответ

Вариант с поворотами
Можно завернуть фото в обёртку и повернуть фото на 45 градусов в одну сторону, а обёртку — на 45 градусов в другую.
Чтобы уменьшить отрезанные уголки, фото уменьшаем, а обёртку увеличиваем в одинаковое количество раз.
http://codepen.io/glebkema/pen/YpWepz
.cut-corners { display: inline-block; height: 400px; width: 400px; overflow: hidden; position: relative; vertical-align: middle; } .cut-corners > div { height: 125%; width: 125%; /* = 5/4 */ overflow: hidden; position: absolute; top: -12.5%; left: -12.5%; transform: rotateZ(45deg); } .cut-corners > div > img { display: block; height: 80%; width: 80%; /* = 4/5 */ position: absolute; top: 10%; left: 10%; transform: rotateZ(-45deg); } .cut-corners.demo { background: orange; margin: 180px; overflow: visible; } .cut-corners.demo > div { background: yellow; }


Git откатить rebase

Такая ситуация, что вместо merge сделал rebase. Получается изменения коряво слились, как можно откатиться к моему локальному коммиту, до того как был сделан rebase и коммит ?


Ответ

Ищите в рефлоге прошлый HEAD-коммит ветки, которую нужно восстановить к прошлому состоянию:
$ git reflog # это просто пример, у вас будут другие id и строки 91e9b6e HEAD@{0}: rebase finished: returning to refs/heads/master 91e9b6e HEAD@{1}: rebase: checkout @{-1} a26257f HEAD@{2}: checkout: ... 91e9b6e HEAD@{3}: commit: ... ...
Просто ищите коммит с тем сообщением, которое вам нужно. Он будет третьим в списке, если вы больше ничего не делали после ребейза.
На всякий случай сделаем бэкап
git branch backup
Потом восстановим текущую ветку к найденному коммиту. Можно использовать как id, так и указатель HEAD@{номер}
git reset --hard HEAD@{2}
Если всё прошло удачно, можно удалять бэкап
git branch -D backup
Подробнее о git reset --hard: Как вернуться (откатиться) к более раннему коммиту?

ping на java из командной строки. проблема с кодировкой

Есть такой код:
import java.io.BufferedReader; import java.io.InputStreamReader;
public class PingIP {
public static void runSystemCommand(String command) {
try { Process p = Runtime.getRuntime().exec(command); BufferedReader inputStream = new BufferedReader( new InputStreamReader(p.getInputStream()));
String s = ""; // reading output stream of the command while ((s = inputStream.readLine()) != null) { System.out.println(s); }
} catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) {
String ip = "google.com"; runSystemCommand("ping " + ip);
}
}
Сохранял файл в разных кодировках из vs studio code. Сохранение в кириллице 1251 на скриншоте. Как поправить кодировку? Cmd выводит ответы пинга на русском языке по умолчанию. Может можно на англ поменять, но это на втором плане, хотелось бы на русском.


Ответ

Программы, которые рассчитаны на использование в Windows в консольном режиме, по историческим причинам используют для вывода кодировку CP866, которая применялась в DOS. Java считает, что строки должны содержать Unicode. Иными словами, поток, который вы получаете от процесса p, содержит CP866, а вы обращаетесь с ним так, как будто он содержит Unicode. Открывайте поток вот так:
BufferedReader inputStream = new BufferedReader(new InputStreamReader( p.getInputStream(), Charset.forName("CP866")));
и всё будет в порядке.

регулярное выражение (re) для строки на русском языке: найти три буквенно-цифровых символа с последующей точкой

Python 2.7.6 проблема с применением re к строке на русском.
задача - найти три буквенно-цифровых символа с последующей точкой; код:
#!/usr/bin/python # -*- coding: utf-8 *-* import re new = re.findall("\w{3}\.", "gth. Ср. дек. 7 21:22:29 EET 2016" ) print new результат >> ['gth.'] вопрос: почему игнорируется 'дек.'?


Ответ

Используйте Unicode-строки и флаг re.UNICODE:
#!/usr/bin/env python2 # -*- coding: utf-8 *-*
import re pattern = re.compile(ur"\w{3}\.", re.UNICODE) match = pattern.findall(u"gth. Ср. дек. 7 21:22:29 EET 2016") print(match) for i in match: print(i)
Результат:
[u'gth.', u'\u0434\u0435\u043a.'] gth. дек.

Удалить ненужные символы в поле MS SQL 2012

Есть таблица с колонками (Column1, Column2, Column3, Column4).
Column4 принимает значения 'dasf895580000000', 'dasf8955sf8000sf0000', 'dasf8955800sf00000 абв', 'абв dasf89558000000sf0sf', '89558000000'
Как удалить всё кроме цифр? Такая проблема встречается очень часто, как создать функцию по удалению ненужных символов в поле?


Ответ

Покажу вариант без функций (оставить только цифры) по одному case на каждую цифру.
select Column1, Column2, Column3, case when len(Column4)>0 and isnumeric(substring(Column4,1,1))=1 then substring(Column4,1,1) else '' end + case when len(Column4)>1 and isnumeric(substring(Column4,2,1))=1 then substring(Column4,2,1) else '' end + case when len(Column4)>2 and isnumeric(substring(Column4,3,1))=1 then substring(Column4,3,1) else '' end + case when len(Column4)>3 and isnumeric(substring(Column4,4,1))=1 then substring(Column4,4,1) else '' end + case when len(Column4)>4 and isnumeric(substring(Column4,5,1))=1 then substring(Column4,5,1) else '' end + case when len(Column4)>5 and isnumeric(substring(Column4,6,1))=1 then substring(Column4,6,1) else '' end + case when len(Column4)>6 and isnumeric(substring(Column4,7,1))=1 then substring(Column4,7,1) else '' end + case when len(Column4)>7 and isnumeric(substring(Column4,8,1))=1 then substring(Column4,8,1) else '' end + case when len(Column4)>8 and isnumeric(substring(Column4,9,1))=1 then substring(Column4,9,1) else '' end + case when len(Column4)>9 and isnumeric(substring(Column4,10,1))=1 then substring(Column4,10,1) else '' end + case when len(Column4)>10 and isnumeric(substring(Column4,11,1))=1 then substring(Column4,11,1) else '' end num from table1

Как узнать где лежит js который вызывает обновление?

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


Ответ

Открываете отладчик браузера (кнопка F12 обычно). Далее на примере хрома (аналоги есть в остальных): Вкладка "Network". Слева сверху панели отладки нажать на кружок "Recording Network Log" чтобы он был красным. Чуть правее и ниже поставить "XHR" (показывать только аякс запросы, а не запросы скриптов картинок и прочего). Инициировать ваш запрос с открытой консолью (страницу обновить скажем). Начнет обновляться табличка с данными запросов. Выбрать наиболее вероятный, порывшись в данных запросов. В таблице данных запроса будет Initiator - js файл, вызвавший запрос.
Можно кликнуть на этот js файл и отладчик перешлет вас на строчку отправляющую запрос. Можно поставить там брейкпоинт, вызвать запрос отправляющий еще раз, и таким образом получить весь коллстек с логикой.

Поиск слова по букве, и замена буквы

Нужно найти в списке слов все слова на букву "в", и заменить букву "в" на букву "а" во всех словах. Как это сделать, без разбивания каждого слова на буквы и замены по индексу. Пример:
Вход:
a=['рука', 'нож', 'ведро', 'Неаполь', 'Виктория', 'материк']
Выход:
a=['рука', 'нож', 'аедро', 'Неаполь', 'аиктория', 'материк']


Ответ

Для списка:
import re
In [143]: print(a) ['рука', 'нож', 'ведро', 'Неаполь', 'Виктория', 'материк', 'бровь']
In [144]: new = [re.sub(r'^в', r'а', word, flags=re.U|re.I) for word in a]
In [145]: print(new) ['рука', 'нож', 'аедро', 'Неаполь', 'аиктория', 'материк', 'бровь'] # ^
Для строки:
import re
s = 'Нужно найти в списке слов все слова на букву "в", и заменить букву "в" на букву "а" во всех словах. Как ето сделать, без разбивания каждого слова на буквы и замены по индексу. Большое Спасибо!' new = re.sub(r'\bв', r'X', s, flags=re.UNICODE)
print(new)
Результат:
Нужно найти X списке слов Xсе слова на букву "X", и заменить букву "X" на букву "а" Xо Xсех словах. Как ето сделать, без разбивания каждого слова на б уквы и замены по индексу. Большое Спасибо!

Почему инициализацию полей прописывают вне тела конструктора

Практически всегда в в примерах кода встречал инициализацию полей класса вне тела конструктора:
MyClass(): a(1),b(2),c(3) { }
а не
MyClass() { a = 1; b = 2; c = 3; }
Если оба варианта рабочие, в чем практическая польза от инициализации вне тела конструктора?


Ответ

В первом случае у вас вызываются конструкторы для полей, и тем самым осуществляется инициализация полей..
Во втором случае у вас сначала вызываются конструкторы по умолчанию, и, если инициализаторы полей отсутствуют в их определении, то затем еще вызываются копирующие операторы присваивания, чтобы инициализировать соответствующим образом эти поля, что может быть в конечном итоге очень затратно.
Представьте, например, что в конструкторе динамически выделяется память. Тогда затем в копирующем операторе присваивания эта память будет переопределяться.
Кроме того может так оказаться, что какой-то член данных вообще не имеет конструктора по умолчанию, а только конструкторы с параметрами. В этом случае второй вариант вообще не будет компилироваться.
Рассмотрите простой пример.
Данная программа будет успешно компилироваться
#include
struct A { int x; A( int x ) : x( x ) {} };
struct B { A a; B() : a( 10 ) {} };
int main() { return 0; }
Однако следующая программа компилироваться не будет
#include
struct A { int x; A( int x ) : x( x ) {} };
struct B { A a; B() { a = 10; } };
int main() { return 0; }
так как отсутствует конструктор по умолчанию у класса A, который должен быть вызван до передачи управления управления в тело конструктора B

Объявление указателей через запятую

Данное предложение объявляет два указателя или указатель и объект? Верно ли это для любого типа переменных?
int* x, y;


Ответ

int* x, y; - указатель x и целочисленная переменная y
* относится к переменной, а не к типу
Объявите тип с помощью typedef (или в C++ - с помощью using) - тогда дело другое:
typedef int * pint; pint x, y;
Здесь и x, и y - указатели на int

Сортировка числового массива .sort() [дубликат]

На данный вопрос уже ответили: Сортировка в JavaScript 1 ответ Необходимо отсортировать массив на нативном JS. Код:
var inputStr = '235 1 0.9 -5 -98 25 -634.1'; var nArr; function getConverArray(arr) { for (var i = 0; i < arr.length; i++) { arr[i] = +arr[i]; } return arr; } nArr = getConverArray(inputStr.split(' ')); alert(nArr); nArr.sort(); alert(nArr);
.sort() всё равно сортирует массив как символьный, хотя после функции getConverArray() массив становится числовым. В чём проблема?


Ответ

https://www.w3schools.com/jsref/jsref_sort.asp
By default, the sort() method sorts the values as strings in alphabetical and ascending order. По умолчанию, метод sort сортирует значения как строки в алфавитном порядке, по возрастанию.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
The default sort order is according to string Unicode code points.
Про
nArr.sort(function(a, b){ return a-b; });
Вы, скорее всего, знаете.
Пример из Проблемма с сортировкой массива
function median(data) { data.sort((a, b) => a - b); return data; } console.log(median([1, 2, 3, 4, 5])); console.log(median([3, 1, 2, 5, 3])); console.log(median([1, 300, 2, 200, 1])); console.log(median([3, 6, 20, 99, 10, 15]));

Как вычислить факториал с++

Здравствуйте!
Как факториал n! вычислить в данной ситуации?
Задание Вывести на экран таблицу значений функции Y(x) и ее разложения вряд S(x) для x, изменяющегося от a до bс шагом h = (b –a)/10

Помочь тут
s += (pow(i,2)+1)/k*pow(x/2,i);
Краткий код.
for (i=1; i<=n; i++) { k=k+fact(i); s += (pow(i,2)+1)/k*pow(x/2,i); } cout << setw(15) << x << setw(15) << y << setw(15) << s << endl; x += h; } return 0; }


Ответ

В Вашем коде стоило изменить лишь строчку
k=k+fact(i)
на
k=k*i
(перед циклом k=1)

c switch default

Привет. Пытаясь ответит на один из вопросов здесь, с удивлением обнаружил, что следующий код
#include int main() { int a = 123; const char *r = "initial value"; switch (a) { case 1: r = "1"; break; if (0) { default: r = "not 1"; } } puts(r); return 0; }
нормально компилируется GCC и выдает при исполнении
not 1
Мне кажется, что код явно с такой ошибкой, что даже компилироваться не должен. В чем тут дело?


Ответ

Тело switch (как и тело while, do/while, for и т.п) это просто statement, в котором мы расставляем метки case и default, и в котором возможно использование break. Не более того.
Метки case и default могут появляться только внутри statement, принадлежащего какому-то switch, но в остальном ограничения, накладываемые на расстановку этих меток, ничем не отличаются от любых других меток.
Аналогичным образом передача управления на эти метки происходит по правилам, похожим на правила goto, с той только разницей, что передать управление на метку case и default может только ее непосредственно охватывающий switch
В вашем случае, если заменить метки case и default на "обычные" метки, мы получим просто составной statement
{ l1: r = "1"; break; if (0) { l2: r = "not 1"; } }
Ничего необычного в этом составном statement-е нет. Положение меток в нем не нарушает никаких правил языка. В том, что метка default: передает управление внутрь ветки некоего if, нет ничего необычного.
Вас никто не заставляет даже использовать именно составной statement для реализации тела switch, т.е. вопреки распространенной практике тело switch не обязательно должно быть заключено в {}. Вы можете воспользоваться любым другим типом statament и расставить метки в нем
int i = rand() % 4; switch (i) if (0) case 0: printf("Privet!
"); else if (0) case 1: printf("Hello!
"); else if (0) case 2: printf("World!
"); else default: printf("Ku-ku!
");
Обратите внимание, что эта замечательная техника написания switch избавляет вас от необходимости помнить о break в конце каждой ветки.

Переключатель количества без редактирования HTML

Всем привет. Появилась такая простенькая задачка, но, почему-то не выходит её толком закончить. Необходимо переключатель количества материалов внедрить на страницу, где нет возможности редактировать html код. Сам выбор значений выглядит так:
(function ($) { $('.spinner').each(function() { var spinner = $(this), input = spinner.find('input[type="text"]'), btnUp = spinner.find('.up'), btnDown = spinner.find('.down'), // options step = 1, min = 1, max = 100; input.val(min); btnUp.click(function(){ input.val() >= max ? $(this).prop("disabled",true) : input.val((input.val()*1) + step); }); btnDown.click(function(){ input.val() <= min ? $(this).prop("disabled",true) : input.val((input.val()*1) - step); }); }); })(jQuery); .spinner { width: 100px; height: 50px; display: table; margin-bottom: 30px; } .spinner input[type="text"] { border-top-left-radius: 3px; border-bottom-left-radius: 3px; width: 50px; text-align: center; height: 50px; float: left; border: 1px solid #ccc; border-right: none; } .spinner .nav { float: left; } .spinner .nav .up, .spinner .nav .down { cursor: pointer; border: 1px solid #ccc; width: 25px; height: 25px; text-align: center; line-height: 25px; background-color: #ddd; color: #333; font-size: 20px; } .spinner .nav .up:hover, .spinner .nav .down:hover { box-shadow: inset 0px 0px 17px 0px rgba(255, 255, 255, 0.5); } .spinner .nav .up { border-top-right-radius: 3px; } .content .container .spinner .nav .down { border-bottom-right-radius: 3px; }


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


Ответ

Вот готовое решение для ваших нужд:
$(document).ready(function(){ inputNumberPolyfill(); }); var increaseIv = null; var increaseTm = null; function inputNumberPolyfill() { //if(Modernizr.inputtypes.number) return; $('.spinner input[type="text"]').each(function(){ var $this = $(this); var step = parseInt($this.attr('step'), 10); if(isNaN(step)) step = 1; $this.parent().append( '

'+ '
'); }); $('.nav a').mousedown(function(ev){ ev.preventDefault(); clearInterval(increaseIv); clearTimeout(increaseTm); var input = $(this); increaseInput(input); increaseTm = setTimeout(function(){ increaseIv = setInterval(function(){ increaseInput(input); }, 60); }, 300); return false; }).mouseup(function(ev){ ev.preventDefault(); clearTimeout(increaseTm); clearInterval(increaseIv); return false; }).mouseout(function(ev){ ev.preventDefault(); clearTimeout(increaseTm); clearInterval(increaseIv); return false; }); $('.spinner input[type="text"]').change(function(ev){ var $this = $(this); var minValue = parseInt($this.attr('min')); var maxValue = parseInt($this.attr('max')); if(isNaN(minValue)) minValue = 0; if(isNaN(maxValue)) maxValue = 9999999; var inputValue = parseInt($this.val()); if(isNaN(inputValue)) inputValue = 0; var finalValue = Math.min(maxValue, Math.max(minValue, inputValue)); if(finalValue != inputValue) $this.val(finalValue); }); } function increaseInput(input) { var $this = input; var spinner = $this.parent(); var spinnerValue = parseInt($this.attr('data-value'), 10); var target = spinner.parent().find('input[type="text"]'); var targetValue = parseInt(target.val(), 10); if(isNaN(targetValue)) targetValue = 0; var minVal = parseInt(target.attr('min')); var maxVal = parseInt(target.attr('max')); if(isNaN(minVal)) minVal = 0; if(isNaN(maxVal)) maxVal = 9999999; var finalValue = targetValue + spinnerValue; finalValue = Math.min(maxVal, Math.max(minVal, finalValue)); target.val(finalValue); } .spinner { width: 100px; height: 50px; display: table; margin-bottom: 30px; } .spinner input[type="text"] { border-top-left-radius: 3px; border-bottom-left-radius: 3px; width: 50px; text-align: center; height: 50px; float: left; border: 1px solid #ccc; border-right: none; } .spinner .nav { float: left; } .spinner .nav .up, .spinner .nav .down { cursor: pointer; display: block; text-decoration: none; border: 1px solid #ccc; width: 25px; height: 25px; text-align: center; line-height: 25px; background-color: #ddd; color: #333; font-size: 20px; } .spinner .nav .up:hover, .spinner .nav .down:hover { box-shadow: inset 0px 0px 17px 0px rgba(255, 255, 255, 0.5); } .spinner .nav .up { border-top-right-radius: 3px; } .content .container .spinner .nav .down { border-bottom-right-radius: 3px; }

Анимация ссылки в формы “волны” на CSS

Добрый день! Подскажите пожалуйста как сделать примерно такую анимацию на CSS:
https://www.youtube.com/watch?v=jxXFzbfud_w&feature=youtu.be
Ещё один вопрос по этой анимации: можно ли сделать так, чтобы буквы красились в определённый цвет при наведении волной?


Ответ

SVG решение:
Анимация начинается при наведении на ссылку Интересней выглядит в полно-экраном режиме.
So easy to do with SVG just few lines
Анимация с применением квадратичных кривых Безье подробно описана в ответе на вопрос «Можно ли сделать с помощью css такую анимацию?» Прочтите, если появился интерес, и тогда будет легче понять, как тут работает анимация.

Приложение создающее другое приложение

Приветствую. Не знаю в какую сторону копать и возможно ли такое вообще. Суть задачи такова : есть приложение написанное на c# в windowsforms. В приложении пользователь задает некоторые параметры, указывает пути к картинке ect и после выполнения всех настроек родительское приложение собирает в папке рядом с собой еще одно exe программу но значительно урезанную согласно установкам пользователя. Можно ли такое сделать если да то в какую сторону рыть, чем гугол мучать ?


Ответ

Нашел небольшой пример по теме. Если кому будет интересно вот код с динамической компиляцией (exe создается из exe) :
using System; using System.CodeDom.Compiler; using System.Collections.Generic; using Microsoft.CSharp;
namespace ConsoleCompiler { internal class Program { private static void Main(string[] args) { // Source code для компиляции string source = @" namespace Foo { public class Bar { static void Main(string[] args) { Bar.SayHello(); System.Console.ReadKey(); }
public static void SayHello() { System.Console.WriteLine(""Hello World""); } } }";
// Настройки компиляции Dictionary providerOptions = new Dictionary { {"CompilerVersion", "v3.5"} }; CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); CompilerParameters compilerParams = new CompilerParameters { OutputAssembly = "D:\\Foo.EXE", GenerateExecutable = true };
// Компиляция CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
// Выводим информацию об ошибках Console.WriteLine("Number of Errors: {0}", results.Errors.Count); foreach (CompilerError err in results.Errors) { Console.WriteLine("ERROR {0}", err.ErrorText); } Console.ReadKey(); } } }
Сам вопрос можно закрывать.

sizeof() и битовые поля

Вот имеется структура:
struct Data { char A : 4; unsigned B: 12; };
Если убрать в ней поле A, то sizeof(Data) выдаст 4. Нормально. Убрать поле B, sizeof(Data) вернет 1. Нормально. А если оставить A и B, то sizeof(Data) вернет 8!. Непонятно.
Почему 8, а не 5?


Ответ

Низкоуровневые детали размещения в памяти битовых полей не стандартизованы и определяются реализацией.
Однако с абстрактной точки зрения битовые поля выделяются внутри т.наз. единиц аллокации. Обычно единица аллокации - это просто полноценное поле того самого типа, который указан в объявлении битового поля. Последовательные битовые поля пакуются в последнюю выделенную единицу аллокации, пока она не заполнится.
И в некоторых реализациях смена типа в объявлении битового поля приводит к досрочному завершению заполнения текущей единицы аллокации и выделению новой единицы аллокации. Т.е. в данном случае при работе с такими реализациями в вашем примере получится две отдельные единицы аллокации: типа char и типа unsigned. В таких реализациях эти единицы аллокации обычно ведут себя так же как и обычные поля соответствующего типа, т.е. фактически вы имеете дело с
struct Data { char unit1; unsigned unit2; };
А такая структура имеет размер 8 из соображений выравнивания. Если же вы явно запросите выравнивание в 1, то такая структура получит размер 5.
В компиляторе GCC, например, используется совсем другой подход к выделению новых единиц аллокации и там ваша структура получит размер 4.

“Частичная” десериализация объекта

В ответ на запрос к API я получаю json следующей структуры:
[ { "address": "someaddress", "code": "ABC12345", "type": "sometype", "category": "somecategory" // + еще около 40 свойств }, ...// такие же объекты ]
Из всего этого мне нужны только два поля "code" и "type", точнее массив объектов SomeType
SomeType { public string code { get; set; } public string type { get; set; } }
Класса, по типу которого сериализуется такой объект у меня нет.
В связи с этим два вопроса:
1) Есть ли смысл создавать такой класс, описывать 40+ полей, если нигде кроме десериализации он использоваться не будет?
2) Есть ли возможность "частичной" десериализации объекта?


Ответ

Да, использование класса, определённого только для десериализации может иметь смысл, т. к. при этом вы проверяете не только несколько полей, а всю структуру, и ловите возможные ошибки. Но это довольно трудоёмкая штука, так что выбирайте сами. Да, есть. Один из методов в ответе @gil9red, другой смотрите ниже.

Альтернативой к dynamic может быть использование JObject (тоже из JSON.NET):
var arr = JArray.Parse(json); var result = arr.Select(item => new SomeType() { code = (string)item["code"], type = (string)item["type"] }) .ToList();
Результат:
foreach (var st in result) Console.WriteLine($"(code = {st.code}, type = {st.type})");
выдаёт
(code = ABC12345, type = sometype) (code = XYZ98765, type = someothertype)

(фиксированный блок) как реализовать?

Помогите фиксировать блок но так чтобы фиксация была когда скролл дойдет до конца блока













































































v


Ответ

Не уверен, что правильно понял насчет того, как именно надо фиксировать, но вот мой вариант.
var windowHeight = window.innerHeight|| document.documentElement.clientHeight|| document.body.clientHeight; var aside = document.querySelector('aside'), asideHeight = aside.clientHeight || aside.offsetHeight || aside.scrollHeight; window.onscroll = function() { if (document.body.scrollTop + windowHeight >= asideHeight) { aside.classList.add('fixed'); aside.style.top = -(asideHeight-windowHeight) + 'px'; } else { aside.classList.remove('fixed'); aside.removeAttribute('style'); } } body { margin: 0 } section { background: linear-gradient(#ccc, #000); height: 3000px; overflow: hidden; } aside { width: 200px; color: #FFF; padding: 15px; background: #000; } .fixed { position: fixed; }


WPF MVVM: поиск и scroll в listview

Есть listview. Он забайдин с ObservableCollection. Возможно ли организовать поиск "на лету" по коллекции с выделением найденного? Т.е. есть TextBox с триггером EventName="TextChanged" и при вводе туда символов, в listview отображать подходящие записи. Нашел такой вариант, но мне нужен MVVM.


Ответ

Задача решается легко, кроме Binding ничего не требуется. Разметка:



ViewModel:
class MainVM : INotifyPropertyChanged { string _pattern; public string Pattern { get => _pattern; set { Set(ref _pattern, value); Selected = Strings.FirstOrDefault(s => s.StartsWith(Pattern)); } }
string _selected; public string Selected { get => _selected; set => Set(ref _selected, value); }
public ObservableCollection Strings { get; }
public MainVM() { Strings = new ObservableCollection { "Телевизор", "Телефон", "Кровать", "Чемодан", "Стол", "Шкаф", "Чайник" }; }
protected void Set(ref T field, T value, [CallerMemberName] string propertyName = "") { field = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
public event PropertyChangedEventHandler PropertyChanged; }


Добавим скролл до выделенного Item. Подпишемся на событие в разметке:

Обработчик события в MainWindow.xaml.cs
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { var listBox = sender as ListBox; listBox.ScrollIntoView(listBox.SelectedItem); }

Скрипт применяется только к одному идентификатору

Есть скрипт:
$(document).ready(function() { var element = $('#divv'); function math_height() { element.height(element.width()); } math_height(); $(window).on('resize', function() { math_height(); }); });

a
b
c
d

Скрипт работает только с первым 'div' на странице. Т.е. на странице отобразится правильно только первый блок.
Как сделать так что бы скрипт отработал со всеми одинаковыми идентификаторами?


Ответ

Это потому что ID должен быть уникальным, их нельзя несколько одинаковых. Используйте классы вместо ID.
$(document).ready(function() { var element = $('.divv'); function math_height() { element.height(element.width()); } math_height(); $(window).on('resize', function() { math_height(); }); });

a
b
c
d

Виртуальная статическая функция

Почему статическая функция не может быть виртуальной?


Ответ

Интересный вопрос.
Ведь статическая функция — это та, которая не принимает указатель (this) на конкретный экземпляр класса, а потому работает исключительно с тем, что принадлежит самому классу (то есть объявлено с ключевым словом static).
В то же время, виртуальная функция отличается от обычного метода исключительно своим присутствием в таблице виртуальных функций (vtable).
То есть технически ничто не мешает поместить статическую (да и вообще любую) функцию в vtbl — это же просто константный массив указателей на функции. Единственное, что изменится для компилятора — пропадание необходимости передавать первым аргументом указатель this некоторым виртуальным функциям.
Но тогда возникает идеологическое противоречие. С одной стороны, статическая функция принадлежит самому классу (неважно какому — базовому или наследнику), а потому не требует знания this. С другой, виртуальность привязана к конкретному экземпляру класса, а потому требует этот указатель. Получаем противоречие: для поиска класса this нужен, а для вызова нет. Какой-то полустатический метод получается.
Поэтому комитет постановил: подобные финты в языке не разрешать.

Цвет для псевдоэлемента

Как возможно решить такую проблему? Есть фигура из 3-х css объектов.
body { margin: 50px 20px; } .main__item_logo { width: 132px; height: 100px; position: relative; background: orange; } .main__item_logo:before { content: ""; position: absolute; top: -35px; left: 0; width: 0; height: 0; border-left: 68px solid transparent; border-right: 64px solid transparent; border-bottom: 35px solid ; } .main__item_logo:after { content: ""; position: absolute; bottom: -35px; left: 0; width: 0; height: 0; border-left: 68px solid transparent; border-right: 64px solid transparent; border-top: 35px solid; }



Необходимо задать значение цвета для псевдоэлементов в строке border-top: 35px solid <цвет>;
Возможно ли как-то передать это свойство, чтобы не плодить множество классов? Есть ли возможность получить значение цвета для псевдоэлемента средствами sass, чистого css, без использования js из основного элемента?


Ответ

Цвет границы можно наследовать.
body { margin: 50px 20px; } .main__item_logo { width: 132px; height: 100px; position: relative; background: blue; border-color: blue; } .main__item_logo:before, .main__item_logo:after { content: ""; position: absolute; left: 0; width: 0; height: 0; border-left: 68px solid transparent; border-right: 64px solid transparent; } .main__item_logo:before { bottom: 100%; border-bottom: 35px solid; border-bottom-color: inherit; } .main__item_logo:after { top: 100%; border-top: 35px solid; border-top-color: inherit; }


Фигурная инициализация std::vector: множественные вложенные скобки

Такой код компилируется:
#include
int main(int argc, char* argv[]) { std::vector v2 = { { {} } }; std::vector v3 { { {} } }; std::vector v4 { { { 1 } } }; std::vector v5 ({ { { 1 } } });
return 0; }
Почему? Как интерпретируются множественные фигурные скобки? Если бы была одна пара скобок, это был бы initializer_list. А во что преобразуются три пары скобок? И почему именно три, а не больше (в GCC)? (Visual Studio 2013 допускает в этой ситуации произвольное количество скобок.)


Ответ

Все варианты используют конструктор std::vector, инициализирующий его из std::intializer_list, а четвертый вариант затем еще использует конструктор копирования вектора.
В данном случае наличие или отсутствие = в синтаксисе лист-инициализации в первых трех вариантах роли не играет, т.е. никакой разницы в семантике первых двух вариантов нет.
Вариант
std::vector v2 = { { {} } };
аналогичен
std::intializer_list temp_list = { {} }; std::vector v2 = { temp_list };
При этом {} является корректным инициализатором для объекта типа int, т.е.
std::intializer_list temp_list = { {} };
в свою очередь аналогично просто
int temp_int = {}; // инициализация нулем std::intializer_list temp_list = { temp_int }; Вариант
std::vector v3 { { {} } };
это, как уже говорилось выше, то же самое, только в синтаксисе прямой лист-инициализации. В варианте
std::vector v4 { { { 1 } } };
{ 1 } - вполне корректный инициализатор для объекта типа int. Т.е. этот вариант аналогичен
int temp_int = { 1 }; std::intializer_list temp_list = { temp_int }; std::vector v4 = { temp_list }; А вот вариант
std::vector v5 ({ { { 1 } } });
использует уже конструктор копирования класса std::vector, т.е. аналогичен
std::vector temp_vector = { { { 1 } } }; // см. вариант 3 std::vector v5(temp_vector);
Например, если мы объявим искусственный класс
struct S { S(std::initializer_list l) {} S(const S&) = delete; };
то первые три варианта прекрасно скомпилируются и для него, а вот четвертый - откажется компилироваться по причине удаленного конструктора копирования.
Попытки увеличивать количество скобок приводят к формированию неправильного инициализатора на самом нижнем уровне: ни { {} }, ни { { 1 } } уже не являются корректными инициализаторами для объекта типа int. Поэтому код не компилируется. Кстати, у меня и VS2015 отказывается компилировать варианты с увеличенным количеством скобок.

Метод для складывания цифр числа

Если ли метод для складывания цифр числа?
Например:
15 = 1 + 5 = 6
или
584 = 5 + 8 + 4 = 17


Ответ

Можно брать остатки и округлять:
function digsum(n) { var sum = 0; while(n) sum += n % 10, n = Math.floor(n / 10); return sum; }
digsum(15) // 6 digsum(584) // 17

Битовый сдвиг для набора байт

Есть byte[]
Требуется выполнить для него битовый сдвиг влево или вправо с минимальными затратами.
В поиске решений я наткнулся на BitArray. Один из его конструкторов принимает массив байт. Класс позволяет выполнять различные битовые операции (AND NOT OR XOR), но не позволяет делать сдвиги.


Ответ

В результате у меня получились 2 функции:
Сдвиг влево
public static byte[] ShiftLeft(byte[] src, int val) { var res = new byte[src.Length]; var byteShift = val >> 3; if (byteShift >= src.Length) return res; val ^= byteShift << 3;
for (var i = 1; i < src.Length - byteShift; i++) res[i + byteShift] = (byte)((src[i] << val) | src[i - 1] >> 8 - val);
res[byteShift] = (byte)(src[0] << val); return res; }
И сдвиг вправо
public static byte[] ShiftRight(byte[] src, int val) { var res = new byte[src.Length]; var byteShift = val >> 3; if (byteShift >= src.Length) return res; val ^= byteShift << 3;
for (var i = byteShift; i < src.Length - 1; i++) res[i - byteShift] = (byte)((src[i] >> val) | src[i + 1] << 8 - val);
res[src.Length - byteShift - 1] = (byte)(src[src.Length - 1] >> val); return res; }
Функции "как есть" предполагают правильное использование. Для меня очень важна скорость, поэтому я не стал делать проверку на отрицательные значения. В идеале отрицательный сдвиг влево - это сдвиг вправо на то же число по модулю.
Так же можно было добавить проверки на нулевой сдвиг, на сдвиг кратный 8 и тд. Возможно, это ускорит общий процесс, но, как показала практика, такие случаи бывают реже, чем в каждом восьмом сдвиге, а каждое условие и операция добавляют дополнительное время выполнения.
И да, Regent говорил что-то про порядок байтов. Я не стал в этом разбираться, потому что тот вариант, который есть сейчас меня полностью устраивает. Если вы получите набор байт из числа типа long и выполните сдвиг моей функцией, то вы получите тот же результат, как если вы сначала выполните такой же сдвиг для числа, а затем получите из результата набор байтов. Набор байтов из числа я получаю функцией BitConverter.GetBytes(theLong)
На данный момент на моем компе мои функции выполняют 10млн сдвигов за 700-900 мс при величине сдвига 0-7 и время обратно пропорционально величине сдвига деленной на 8. То есть то же самое количество сдвигов на 8-15 выполнится быстрее, чем на 0-7, а на 16-23 еще быстрее и тд...
UPD
Указанное время на выполнение указано для Debug. В релизе все работает в 3-4 раза быстрее.

Как из полной даты выводить только часы, минуты и секунды?

Есть время, написанное
Tue Jul 04 2017 23:10:46 GMT+0300 (Беларусь (зима))
Но мне нужно чтобы я мог получить в переменную только эту часть "23:10:46".Подскажите, как это сделать?
P.s.: Эту дату я получаю из миллисекунд, возможно есть способ получить время не посредственно из них?
var time = 1499199458; var date = new Date(+time * 1000); var h, m, s; h = date.getHours(); m = date.getMinutes(); s = date.getSeconds(); var correct_date = h + ':' + m + ':' + s; console.log(correct_date);
Поскольку время в таком виде мне нужно было только для вставки его в Html такой вариант вполне меня устраивает. Но если не сложно то подскажите, как сделать так что бы когда кол-во часов, минут или секунд меньше 10 я получал например 01:09:05, а не 1:9:5?


Ответ

Распарсить дату, получить из неё всё необходимое и отформатировать:
ВНИМАНИЕ: Если есть сразу дата, то конвертировать её в строку, а затем парсить НЕ надо!
var s = "Tue Jul 04 2017 23:10:46 GMT+0300 (Беларусь (зима))" console.log(s) var d = new Date(s) console.log(d+"") console.log(d) var res = [d.getHours(), d.getMinutes(), d.getSeconds()].map(function (x) { return x < 10 ? "0" + x : x }).join(":") console.log(res)
Обращаю внимание, что этот способ пересчитает часовой пояс в текущий:

Как в Mockito проверить что метод не был вызван?

Для того чтобы проверить что метод был вызван мы вызываем verify(mock).method(). А как проверить обратное, что метод вызван не был?


Ответ

Использование метода verify в Mockito (из документации):
LinkedList mockedList = mock(LinkedList.class); mockedList.add("once");
mockedList.add("twice"); mockedList.add("twice");
mockedList.add("three times"); mockedList.add("three times"); mockedList.add("three times");
Чтобы удостоверится что метод был вызван один раз
verify(mockedList).add("once");
или
verify(mockedList, times(1)).add("once");
Оба варианта идентичны так как:
public static T verify(T mock) { return MOCKITO_CORE.verify(mock, times(1)); }
Для вашего случая подойдут варианты:
verify(mockedList, times(0)).add("never happened"); verify(mockedList, never()).add("never happened");
javajunitmockito

Как сделать зацикленную анимацию типа “челночный бег”?


Рыбка плывет определенное расстояние, по достижению которого должна развернуться и поплыть обратно. Какие правила анимации нужно сделать?
CSS
@keyframes go-right-left { from { right: 0px; } to { right: calc(40% - 50px); } }
@-webkit-keyframes go-right-left { from { right: 0px; } to { right: calc(40% - 50px); } }
.fish-blue { animation: go-right-left 60s ease infinite alternate; -webkit-animation: go-right-left 60s ease infinite alternate; position: relative; }


Ответ

С alternate много багов, поэтому лучше так:
.fish { background: url('https://image.ibb.co/iRhXWL/an144.gif') no-repeat; height: 61px; width: 100px; position: absolute; top: 50px; transition: left 2.4s; animation: fish 5s ease infinite, fish-rotate 5s steps(1) infinite; } @keyframes fish { 0% { left: 20px; } 50% { left: 300px; } 100% { left: 20px; } } @keyframes fish-rotate { 0% { transform: scale(-1, 1) } 50% { transform: scale(1, 1) } 100% { transform: scale(-1, 1) } }


Панель управления для Landing Page?

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


Ответ

textolite.ru - самое простое, что есть. Установка - перетаскиваешь папку через FTP в корень лэндинга к index.html и вуаля, сделано :)

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

Думал написать вот так:
var task1 = Task.Factory.StartNew(() => { File.Copy(Path,NewName1, true); }); var task2 = Task.Factory.StartNew(() => { File.Copy(Path,NewName2, true); });
Но бьет исключение, что файл занят другим процессом: An exception of type 'System.IO.IOException' occurred in mscorlib.dll but was not handled in user code Additional information: Процесс не может получить доступ к файлу "D:\output\log4.txt", так как этот файл используется другим процессом. Есть ли возможность или какие-то варианты одновременно скопировать файл по разным путям? Или есть какие-то варианты ускорить сей процесс? Спасибо.


Ответ

Реализация через FileStream (в зависимости от типичного для задачи объема файла имеет смысл поэкспериментировать с размером буфера):
public void ParallelCopy(string src, params string[] dsts) { Parallel.ForEach(dsts, new ParallelOptions(), dstOne => { using (FileStream source = new FileStream(src, FileMode.Open, FileAccess.Read, FileShare.Read))
using (FileStream destination = new FileStream(dstOne, FileMode.Create)) { var buffer = new byte[4096]; int read;
while ((read = source.Read(buffer, 0, buffer.Length)) > 0) { destination.Write(buffer, 0, read); } }
}); }
Использование:
ParallelCopy(@"x:\source.file", @"c:\destination1.file", @"d:\destination2.file");

Различные …SdkVersion в build.gradle файле

Допустим, в build.gradle файле есть следующие строки:
android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.common.app" versionCode 1 versionName "1.0" minSdkVersion 15 targetSdkVersion 18 } }
Что значит minSdkVersion более-менее понятно - минимальная версия уровня API, на устройствах с API ниже которой приложение не будет запускаться. А что значат остальные ...SdkVersion: targetSdkVersion, compileSdkVersion и buildToolsVersion?
Да, я читала, что targetSdkVersion - это версия API, о которой ты думаешь, когда пишешь приложение (типа API целевого устройства), compileSdkVersion - это версия API для компиляции, buildToolsVersion - версия Android SDK build tools, но как-то это не добавляет понимания, зачем их нужно так много... А ещё же есть Android Plugin Version и Gradle Version - как они со всеми этими ...SdkVersion соотносятся?..


Ответ

Gradle version - версия, использумая для обработки gradle скриптов, влияет на процесс сборки (косвенно зависит от Android Gradle Plugin)
Android Gradle Plugin version - версия плагина, для обработки секции android { ... } в build.gradle, влияет на процесс сборки (зависит от необходимой поддержки: например нативная поддержка лямбд из JDK8 требует 2.4.0+)
buildToolsVersion (рекомендуется последняя) - версия утилит (dx, aapt, etc) из sdk/build-tools/, которые будут использоваться для сборки (не зависит)
minSdkVersion - прописывается в AndroidManifest, приложение не установится, если системный SDK меньше. (не зависит)
maxSdkVersion (редко используется) - прописывается в AndroidManifest, приложение не установится, если системный SDK больше. (не зависит)
compileSdkVersion - версия android.jar, которая будет подключаться при компиляции, если будет попытка использовать API из новой версии - не скомпилируется (зависит от java кода)
targetSdkVersion - не влияет на компиляцию, это обещание для системы "приложение должно хорошо работать на версии Х", влияет на то, будут ли включаться legacy-механизмы (например, для разрешений при targetSdkVersion < 23). Так же может влиять на внешний вид приложения
Так же должно выполняться: minSdkVersion <= targetSdkVersion <= compileSdkVersion

Картинка в инпуте

Здравствуйте!
Мне нужно сделать вот такую штуку:

А получается как то так:

Как исправить эту ситуацию? Заранее благодарен за любую помощь! input.contacts { font-family: "MullerRegular", sans-serif; font-size: 13px; padding: 10px 126px 10px 40px; margin: 20px; } div.inputname { background: url("../img/contact/human.png"); background-repeat: no-repeat; width:55px; height:55px; position: relative; display: inline; } div.inputphone { background: url("../img/contact/phone.png"); background-repeat: no-repeat; display: inline; width:55px; height:55px; position: relative; } div.inputemail { background: url("../img/contact/mail.png"); background-repeat: no-repeat; display: inline; width:55px; height:55px; position: relative; }



Ответ

Используйте background-position для установки позиции фонового изображения:
input.contacts { font-family: "MullerRegular", sans-serif; font-size: 13px; padding: 10px 126px 10px 40px; margin: 20px; background: transparent; box-shadow: none; border: #ccc solid 1px; } div.inputname { height: 55px; position: relative; display: inline; } div.inputname input { background: url('https://i.stack.imgur.com/GYpu2.png'); background-repeat: no-repeat; background-position: 10px center; } div.inputphone { display: inline; height: 55px; position: relative; } div.inputphone input { background: url('https://i.stack.imgur.com/wp8iA.png'); background-repeat: no-repeat; background-position: 10px center; } div.inputemail { display: inline; height: 55px; position: relative; } div.inputemail input { background: url('https://i.stack.imgur.com/JtqeI.png'); background-repeat: no-repeat; background-position: 10px center; }


Как найти функцию обработки события onchange или другого события?


Я хочу посмотреть как обрабатываются события нажатия кнопки.
Каким образом мне можно найти эту функцию onchange="selmarshClick(this)"?


Ответ

Если нажать F12 в Chrome и зайти на вкладку Sources, то можно увидеть панель со вкладками, которые помогают при отладке. Одной из таких вкладок будет Event Listener Breakpoints, в которой можно назначить в качестве триггера любые события, при которых исполнение скрипта будет остановлено. Выбирай на вкус.
В данном случае нужно будет выбрать Control → change


Для Firefox нужно зайти в Инспектор, найти тот самый элемент, в котором прописано событие и обнаружить рядом значок em

Кликнув на него, как утверждает developer.mozilla.org/ru/docs можно увидеть строчки:

где можно увидеть события, навешанные на элемент, скрипт, строку, возможность нажать на паузу и т.д.
Если в Firefox нет кнопки паузы, как обещают, то можно попробовать посмотреть во вкладку Debugger(отладчик) и попробовать найти стрелку, при наведении на которую будет написано "Events". Там уже должно быть событие этого элемента.
А вот таких полезных вкладок как у Chrome к сожалению у Firefox я не вижу.

Как эффективнее всего распарсить огромный файл логов на слабой машине?

Есть сервер с 1gb RAM. Есть лог файл nginx (любой другой веб-сервер) на 70gb. Как максимально быстро собрать статистику по user agent пользователей сайта, учитывая описанные ограничения по ресурсам.


Ответ

можно воспользоваться StringTokenizer в языке Java, который позволяет считывать файл построчно и не тратить память на хранение всех строк файла.
StringTokenizer tok = new StringTokenizer("/path/to/file"); while (tok.hasMoreTokens()) { String line = tok.nextToken(); // работаешь со строкой. }
Также можно указывать разделитель в конструкторе, по умолчанию стоит \t

\f