Страницы

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

суббота, 20 апреля 2019 г.

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

Привет всем!
Подскажите как организовать счетчик, который бы на стороне клиента показывал сколько раз клиент отправлял запрос( у меня клиент - просто main - выводит в консоль) Есть совсем простое приложение, которые развернуто на glassfish локально.
Вот касс с клиентской частью:
package com.mkyong.client;
import com.mkyong.rest.JSONService; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource;
public class JerseyClientPost {
public static void main(String[] args) {
try {
Client client = Client.create();
WebResource webResource = client .resource("http://localhost:8080/RESTfulExample3/rest/json/metallica/post");
String input = "{\"singer\":\"Metallica\",\"title\":\"Fade To Black\"}";
ClientResponse response = webResource.type("application/json") .post(ClientResponse.class, input);
if (response.getStatus() != 201) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); }
System.out.println("Output from Server ....
"); String output = response.getEntity(String.class); System.out.println(output);

} catch (Exception e) { e.printStackTrace();
}
} }
А вот с серверной:
package com.mkyong.rest;
import com.mkyong.CounterOfCalls; import com.mkyong.Track; import com.sun.jersey.spi.inject.Inject;
import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response;
@Path("/json/metallica") public class JSONService {
@GET @Path("/get") @Produces(MediaType.APPLICATION_JSON) public Track getTrackInJSON() {
Track track = new Track(); track.setTitle("Enter Sandman"); track.setSinger("Metallica");
return track;
}
@POST @Path("/post") @Consumes(MediaType.APPLICATION_JSON) public Response createTrackInJSON(Track track) {
String result = "Track saved : " + track; return Response.status(201).entity(result).build();
}
}
Подскажите как должен выглядеть счетчик.
Это должна быть функция вроде такой? или как вообще и как это потом вызвать из-под клиента:
int count = 0; @POST @Path("/post") @Produces(MediaType.APPLICATION_JSON) public Integer getCountCalls(){ return count++; }


Ответ

Все оказалось просто:
в классе-клиенте появилось
WebResource webResource1 = client.resource("http://localhost:8080/RESTfulExample/rest/json/metallica/counter"); ClientResponse response1 = webResource1.type("application/json").post(ClientResponse.class); String output1 = response1.getEntity(String.class); System.out.println(output1);
а на сервере метод
static int count = 0; @POST @Path("/counter") @Consumes(MediaType.APPLICATION_JSON) public Response createTackInJSON1() { String result = "Count = " + ++count; return Response.status(201).entity(result).build(); }
обязательно нужно сделать переменную count статической , иначе счетчик будет все время показывать единицу.

Изменить курсор на свой C# WinForms

Подскажите как изменить курсор на свой? Делаю так :
Cursor cur = new Cursor(new System.IO.MemoryStream(global::MSU.Properties.Resources.cursorDragDrop));
Пишет ошибку -
Наиболее подходящий перегруженный метод для "System.IO.MemoryStream.MemoryStream(int)" имеет несколько недопустимых аргументов


Ответ

К примеру можно сделать так (из доступных курсоров):
Cursor.Current = Cursors.WaitCursor;
Или же свой курсор вот так:
Cursor.Current = new Cursor("C:\\<путь к файлу>\\icon.cur");
Кстати, обратите внимание на расширение файла .cur, к примеру .gif туда нельзя упаковать. В VisualStudio есть возможность создать Cursor File (по крайней мере была). Все что Вам нужно - это указать путь к файлу и собственно говоря - сам файл. Будет полезно: Cursors - свойства

Если хочется зашить в программу, то думаю стоит добавить файл курсора(.cur) в ресурсы проекта. Затем в коде получить этот файл, конвертировать и создать курсор, что-то на подобии этого:
var img = new Bitmap(WindowsFormsApplication1.Properties.Resources.myCursor); Icon icon = Icon.FromHandle(img.GetHicon()); Cursor cur = new Cursor(icon.Handle); Cursor.Current = cur;
Данный код приведен в качестве альтернативного примера, но в нем имеются свои недостатки в виде утечки нативных ресурсов. Также, если кликнуть мышкой в окне чужой программы - может возникнуть проблема. Поэтому советую ознакомиться с этим ответом Change Cursor HotSpot in WinForms .NET, он будет более правильным, с использованием WinAPI

Нарисовать круг средствами html4/js (без явного css)

Всем доброго времени суток! Есть такая интересная задача - нарисовать круг средствами html и js. По сути, задача сводится к созданию div на разметке определенной ширины/высоты. Саму методику я могу предложить т.к. есть способ рисовать например ромб
var obj = document.getElementById('container'); var tmp, k = 0, m = 200; for (var i = 0; i <= m; i++) { if (i > m / 2) k--; else k++; tmp = document.createElement('div'); //tmp.style.border = '1px solid #111fff' tmp.style.width = k + 'px'; tmp.style.height = '1px'; obj.appendChild(tmp); } #container { width: 100%; display: block; padding: 10px; } #container div { background-color: lightblue; margin: 0 auto; }


Но я хотел бы попросить помощи в алгоритме рисования подобным образом круга. Как правильно составить алгоритм, который построчно нарисует круг с помощью дивов? Я пытался сделать при помощи формулы c = 2R*sin(angle/2), где с - это расстояние между точками на окружности, а angle - это угол в радианах. Но получается капля, а не круг. Код "капли":
var obj = document.getElementById('container1'); var tmp, k = 0, m = 300, angl = 0; for (var i = 0; i <= m; i++) { if (angl > 360) angl = 360; tmp = document.createElement('div'); var sinus = Math.sin((Math.PI * angl / 180) / 2); tmp.style.width = m * sinus + 'px'; tmp.style.height = '1px'; obj.appendChild(tmp); var nexAngle = 360 / m; angl += nexAngle; } #container, #container1 { width: 100%; display: block; padding: 10px; } #container1 div { background-color: lightgreen; margin: 0 auto; }

P.S код очень некрасивый т.к. делалось "в лоб" )
UPD: @pavel и @Gleb Kemarsky оба ответили на поставленный вопрос, просто немного разными способами (хоть в итоге все сводится к одной формуле). За реализацию на JQuery спасибо @Elena Semenchenko! @sitev_ru тоже спасибо! Поэтому заинтересованным советую обратить внимание на все ответы данного вопроса. Спасибо !


Ответ

Думаю, лучше не через угол, а через отрезки.
Задаём радиус. Проходим круг по вертикали и рисуем хорды. Половина от длины хорды - корень квадратный из разницы между квадратом радиуса и квадратом "высоты" хорды.
var obj = document.getElementById('container1'); var tmp, radius = 200; for (var i = 0; i <= 2 * radius; i++) { var height = Math.abs(radius - i); var chord = 2 * Math.sqrt(radius * radius - height * height); tmp = document.createElement('div'); tmp.style.height = '1px'; tmp.style.width = chord + 'px'; obj.appendChild(tmp); } #container1 div { background-color: lightgreen; margin: 0 auto; }


Какой смысл в числах SYN и ACK в протоколе TCP?

Привет. Не понимаю, что значит SYN и ACK при установке соединения по протоколу TCP. Кучу видео пересмотрел и не понял. Кто разобрался в этом? Какой смысл в этих SYN и ACK (зачем их вообще придумали)? Какими-то непонятными числами компьютеры обмениваются, какие-то приращения SYN на единицу... Нужен какой-то просто пример, понятный для того, кто вообще в сетях не разбирается.


Ответ

Придумали их с той важной целью, что пакеты, передющиеся по TCP, могут прийти не в той же последовательности что были отправлены и не в том же составе. Нужен механизм, который позволит собрать набор полученных пакетов в правильной последовательности. И заодно проверить все ли пакеты присутствуют или кто-то на пол пути сошёл с дистанции и потерялся.
Эту задачу и решают при помощи номеров очереди и номеров подтверждений. Номера очереди (номера последовательности) - просто нумеруют отправляемые пакеты. Это число увеличивается в зависимости от длины поля данных. Каждый октет данных (т. е. каждый байт) одного пакета имеет свой номер очереди. Номер очереди первого октета данных и передаётся в заголовке TCP пакета, он же и считается номером очереди для пакета. Номера подтверждений - сообщают другой стороне номер очереди который ожидается получить от неё следующим. Они говорят, что пакеты со всеми предыдущими номерами очередей (но не включая этот) уже были получены.
Первоначальный номер очереди высылается клиентом при установлении соединения вместе с флагом SYN. Сервер в ответ высылает номер подтверждения (полученный номер очереди + 1) и свой номер очереди (в целом любой, но при использовании механизма SYN coockie построенному по определённому алгоритму). Сервер в данный момент сообщает клиенту что ожидает от него пакет, который будет иметь номер очереди равный отправленному номеру подтверждения. От этого номера клиент в дальнейшем и отталкивается.
Далее всё происходит таким образом - одна сторона (сторона А) отправляет другой (стороне Б) пакеты, пронумерованные номерами очередей. Вторая сторона принимает их и сообщает номер очереди, которая она ожидает получить от А со следующим пакетом. Это говорит о том, что сторона Б получила все пакеты, у которых номер очереди был ниже переданного номера подтверждения (но не равен ему) и что сторона Б ожидает, что в следующей партии переданных данных нумерация начнётся как раз с этого номера.
На всякий случай ещё раз - поле TCP Номер очереди (Порядковый номер) означает просто номер пакета, нужен для того, что бы пакеты правильно собрать и обнаружить пропажу (или дубликат). Поле Номер подтверждения служит для информирования второй стороны о том какие пакеты были от неё уже получены (с какими порядковыми номерами) и содержит число, которое ожидается увидеть в поле Номер очереди следующего полученного пакета от этого же источника.
P. S. SYN и ACK это всё же флаги, а не числа. Они говорят о том, что задействованы соответствующие поля заголовка (флаги TCP)

синхронизация трех датафреймов по времени

Есть три датафрейма немного разной длинны потому что наблюдения велись начиная с разного времени,
как их можно синхронизировать по времени чтоб оставить только те наблюдения которые есть во всех трех фреймах и выкинуть те которые попадаются только в отдельных фреймах
вот сами дата фреймы
> head(sec1) date time open high low close vol 1 2016.09.06 08:45 3081.5 3082.5 3080.5 3080.5 6 2 2016.09.06 08:50 3081.5 3081.5 3079.5 3080.5 6 3 2016.09.06 08:55 3081.5 3082.5 3081.5 3082.5 19 4 2016.09.06 09:00 3083.5 3083.5 3081.5 3082.5 19 5 2016.09.06 09:05 3083.5 3085.5 3082.5 3085.5 8 6 2016.09.06 09:10 3086.5 3086.5 3084.5 3086.5 15 > head(sec2) date time open high low close vol 1 2016.09.13 13:00 95.34 95.40 95.33 95.39 36 2 2016.09.13 13:05 95.40 95.43 95.39 95.41 40 3 2016.09.13 13:10 95.42 95.44 95.40 95.42 37 4 2016.09.13 13:15 95.41 95.42 95.39 95.39 25 5 2016.09.13 13:20 95.40 95.41 95.38 95.38 21 6 2016.09.13 13:25 95.39 95.42 95.38 95.42 32 > head(sec3) date time open high low close vol 1 2016.09.14 18:10 1.12433 1.12456 1.12431 1.12450 137 2 2016.09.14 18:15 1.12444 1.12459 1.12424 1.12455 139 3 2016.09.14 18:20 1.12454 1.12477 1.12446 1.12469 148 4 2016.09.14 18:25 1.12468 1.12474 1.12442 1.12453 120 5 2016.09.14 18:30 1.12452 1.12483 1.12442 1.12482 156 6 2016.09.14 18:35 1.12481 1.12499 1.12472 1.12474 126
Те на выходе должно получиться три датафрейма одинаковой длинны (nrow) и все строчки датафреймов должны иметь одинаковую дату и время


Ответ

Если я правильно понял задачу, то нужно определить пересекающиеся интервалы дат и времени и отфильтровать наблюдения, попадающие в эти интервалы. Омечу, что приведённые в качестве примера данные не пересекаются по датам.
Определим границы для дат:
min_date <- list(df1, df2, df3) %>% sapply(. %>% .subset2("date") %>% as.Date(format = "%Y.%m.%d") %>% min()) %>% max() max_date <- list(df1, df2, df3) %>% sapply(. %>% .subset2("date") %>% as.Date(format = "%Y.%m.%d") %>% max()) %>% min()
Теперь то же самое для времени:
min_time <- list(df1, df2, df3) %>% sapply(. %>% .subset2("time") %>% as.POSIXct(format = "%H:%M") %>% min()) %>% max() max_time <- list(df1, df2, df3) %>% sapply(. %>% .subset2("time") %>% as.POSIXct(format = "%H:%M") %>% min()) %>% min()
Теперь можно отфильтровать наблюдения:
df1 <- df1 %>% mutate(date = as.Date(date, format = "%Y.%m.%d")) %>% filter(date >= min_date & date <= max_date) %>% mutate(time = as.POSIXct(time, format = "%H:%M")) %>% filter(time >= min_time & time <= max_time)
Чтобы код работал, нужно загрузить пакет dplyr

Как в Intellj Idea подключить к проекту файлы class?

Есть папка и в ней лежат уже скомпилированные классы. Как из них вызвать методы? Закинул в каталог проекта, и написал
import javax.help;
В результате Error:(15, 18) java: package javax.help does not exist.


Ответ

Пример из консоли
Структура каталогов:
C:\dev\ TestImp.class c:\dev\mypack\ Test.class
Код класса Test:
package mypack;
public class Test { public Test() { System.out.println("I live!"); } }
Код класса TestImp:
import mypack.Test;
public class TestImp { public static void main(String[] args) { Test t = new Test(); } }
В консоли переходим в каталог c:\dev\ и выполняем:
java TestImp
В консоль выводится:
I live!
UPD:
Что касается Intellj Idea - вам требуется запаковать ваши файлы классов в jar командой
jar cf test.jar Test1.class
После этого импортируете jar в проект следующим образом:
Структура проекта (CTRL + SHIFT + ALT + S on Windows/Linux, ⌘ + ; on Mac OS X) Modules на левой панели. Вкладка Dependencies '+' → JARs or directories
UPD2:
Intellij IDEA позволяет добавлять не только JAR'ы, но и каталоги с классами. Делается полностью аналогично написанному выше, только выбирается каталог с классами. После выбора откроется диалог, в котором можно исключить какие либо подкаталоги выбранного каталога.

Буферизация при IO в C#

Подскажите, в чем смысл буферизации при чтении и записи?
Почему нельзя читая сразу писать?
Например, нужно скопировать файл из пункта А в пункт Б.
Сначала мы считываем байты в буфер, а потом из этого буфера начинаем запись.
Так как буфер является настраиваемым параметрам, то когда следует использовать большой буфер, а когда маленький и какой в этом получается профит.
Например, в некоторых исходниках .NET классов явным образам пробиты константы размера буфера.


Ответ

Можно ознакомиться с этим материалом: Sequential File Programming Patterns and Performance with .NET. Написана статья в 2004, но обновление сделано в 2010 (судя по датам в тексте).
Приведу выдержку (вольный перевод мой):
Для одного диска используйте настройки по умолчанию фреймворка .NET - они предоставляют отличную производительность для последовательного доступа к файлу. Предварительно выделяйте место для больших файлов (используя SetLength() method), когда создаете файл. Это обычно улучшает скорость примерно на 13% в сравнении с фрагментированным файлом. По крайней мере, сейчас, дисковые массивы требуют небуферизованный IO для достижения лучшей производительности. Буферизованный IO может быть в 8 раз медленнее, чем небуферизованный. Мы ожидаем, что эта проблема будет рассмотрена в более поздних выпусках .NET-фреймворка. Если вы делаете свою собственную буферизацию, используйте большие размеры буфера (64 Кб хорошая отправная точка). Используя .NET-фреймворк, один процессор может читать и писать дисковый массив на скорости свыше 800 Мб*сек, используя небуферизованный IO.
Самым интересным в этом списке является пункт 3: при копировании данных с одного физического диска на другой физический буферизация вредна (естественно, буферизация на уровне драйвера диска остается). В остальных случаях она, по крайней мере, не вредит.

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

setInterval и задержки

День добрый, Господа! При написании скрипта столкнулся с такой проблемой: я задал переменной значение, затем я подставил эту переменную в setInterval в задержку, однако при изменении этой переменной интервал между выполнениями функции не изменялся. Возник вопрос: можно ли вообще подставить переменную как значение задержки в setInterval. Такой код есть на данный момент, передаю вам штурвал.
setInterval(ggg, 1000); var iter = 0; var pulse = 90; var time = 100; setInterval(timer, 1000); function ggg() { var aza = setInterval(ggg, 1000); setTimeout(ggg, 1000); clearInterval(aza); var aza = setInterval(ggg, 2000); }; function pulsing() { heart.style.backgroundColor = 'red'; setTimeout(back, 300); function back() { heart.style.backgroundColor = 'black'; }; }; function timer() { time--; }; Kek



Ответ

Нет, переменную как значение задержки в setInterval подставить нельзя, вот почему: setInterval выполняет код много раз через равные промежутки времени, пока он не будет остановлен вызовом clearInterval. т.е. промежуток задается один раз (при вызове setInterval).
Для того, чтобы сделать так, как вы хотите - нужно каждый раз "уничтожать" setInterval и заново создавать его, с уже новым промежутком(который есть у вас в переменной).
PS. это можно сделать разными способами, как один из возможных - при помощи Object.prototype.watch() (учитывая его не поддержку:D, можно юзать - полифилл).
var timerObj = { interval: 0, timerId: 0, func: my_function}; // объект для интервала
timerObj.watch('interval', function(prop, oldval, val) { // тут пересоздавать сам setInterval нужно: if(timerObj.timerId) clearTimeout(timerObj.timerId); timerObj.timerId = setInterval(this.func, val); });
timerObj.interval = 1000; // запустили интервал
// много кода
timerObj.interval = 5000; // в любом месте меняет, он сам пересоздается)
// можно еще придумать методы для полной остановки и т.д.
PPS. как в комментариях верно подметили - лучше использовать Object.defineProperty, тогда код выглядел бы так(полифилл не нужен):
var timerObj = {timerId: 0, func: my_function}; // объект для интервала Object.defineProperty(timerObj, 'interval', { set:function(val){ if(timerObj.timerId) clearTimeout(timerObj.timerId); timerObj.timerId = setInterval(timerObj.func, val); } });
timerObj.interval = 1000;
// много кода
timerObj.interval = 5000;

SQL-запрос для массового заполнения таблицы

Приветствую, мне надо прописать одну картинку для товаров с id от 1 до 1261
Команда
INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) VALUES (1, 'images/products/2016/09/none.png', '', 0, '2016-09-29 11:07:36', 1);
делает нужное для товара с id 1. Не в ручную же 1261 такой запрос создавать, подскажите, как автоматизировать.


Ответ

Предполагаю, что у вас есть некая таблица продуктов в которой уже существуют записи с такими id и вы хотите в связанную с ней таблицу изображений вставить указанные строки. Если так, то вы можете написать что то вроде:
INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id, 'images/products/2016/09/none.png', '', 0, '2016-09-29 11:07:36', id from products where id between 1 and 1261
Если такой таблицы нет, то можно воспользоваться самой же таблицей catalogue_productimage. Для этого вставляем в нее вашу первую запись, а последующие вставляем несколькими запросами вроде таких (если в таблице изначально только 1 запись):
INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id+1, original, caption, display_order, date_created, id+1 from catalogue_productimage;
INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id+2, original, caption, display_order, date_created, id+2 from catalogue_productimage;
INSERT INTO `catalogue_productimage` (`id`, `original`, `caption`, `display_order`, `date_created`, `product_id`) select id+4, original, caption, display_order, date_created, id+4 from catalogue_productimage;
Фокус в том, что каждый последующий запрос создает в 2 раза больше записей, чем предыдущий, таким образом что бы дойти до значений около 1261 нам понадобится не более 11 таких запросов. Запросы отличаются друг от друга только прибавлением к ID очередной степени двойки. В последнем запросе нам надо будет ограничить максимальный id, запрос тогда получит условие where id<=1261-1024

потеря значения поля C#

namespace DZ_4 { class Program { static void Main(string[] args) { TeamLeader pr1 = new TeamLeader(); pr1.Condition();//проверяем состояние стройки: построен или нет фундамент Basement bsm = new Basement(); bsm.Installation(); pr1.Condition();//проверяем состояние стройки: построен или нет фундамент (ОПЯТЬ ВОЗВРАЩАЕТ, ЧТО ФУНДАМЕНТ НЕ ПОСТРОЕН) }
class TeamLeader { public void Condition()//метод для проверки состояния строительства { House b = new House(); b.Condition();//метод для проверки постройки фундамента } }
class House : TeamLeader { private int Bsement { get; set; }
public new void Condition() { if (Bsement == 1) { Console.WriteLine("Фундамент построен"); } else { Console.WriteLine("Фундамент не построен"); } }
public void Result(int b) { Bsement = b; } }
class Basement : House { public void Installation()//отрисовка фундамента { Console.WriteLine("Солнце всходит - пора за работу!"); System.Threading.Thread.Sleep(4000);
Console.BackgroundColor = ConsoleColor.DarkBlue; Console.Clear(); for (int i = 0; i <= 50; i++) { Console.Write("_"); System.Threading.Thread.Sleep(40); } Console.WriteLine(); for (int i = 0; i <= 5; i++) { Console.Write("I"); for (int j = 0; j <= 48; j++) { Console.Write(" "); } Console.WriteLine("I"); System.Threading.Thread.Sleep(40); }
System.Threading.Thread.Sleep(100); Console.BackgroundColor = ConsoleColor.Blue; for (int i = 0; i <= 50; i++) { Console.Write("-"); System.Threading.Thread.Sleep(40); } Console.WriteLine(); Console.WriteLine("Стоп!"); Result(1);//передаем флажок об окончании строительства } } } }
При повторном вызове метода Condition() экземпляра TeamLeader pr1, после отрисовки фундамента и установки флажка об окончании строительства, метод опять возвращает 0, то есть "фундамент не построен". В чем загвоздка и как это исправить?


Ответ

Я бы сделал так:
Прораб и дом — отдельные сущности. Прорабу могут дать задание заняться домом. Фундамент тоже не является домом, никак. Дом включает в себя фундамент. Не дело главной программы создавать фундамент. И не дело фундамента устанавливать самого себя в дом.
Это выливается в такой код:
static void Main(string[] args) { House house = new House(); TeamLeader pr1 = new TeamLeader(); pr1.WorkOnHouse(house); bool hasBasement = house.Basement != null; if (hasBasement) Console.WriteLine("Фундамент есть"); else Console.WriteLine("Фундамента нет");
pr1.ConstructBasement();
hasBasement = house.Basement != null; if (hasBasement) Console.WriteLine("Фундамент есть"); else Console.WriteLine("Фундамента нет"); }
Теперь прораб.
class TeamLeader { House house; // текущая стройка // посылаем на объект public WorkOnHouse(House house) { this.house = house; } public ConstructBasement() { if (house == null) throw new InvalidOperationException("Сначала направьте на стройку"); if (house.Basement != null) throw new InvalidOperationException("Да есть уже фундамент, чё совсем ку-ку?"); Basement basement = new Basement(); basement.Construct(); // строим house.Basement = basement; } }
Теперь дом. Он простой как... угол дома!
class House { public Basement Basement { get; set; } // тут будут другие части дома }
Ну и фундамент.
class Basement { bool IsConstructed { get; private set; } = false;
public void Construct() { Console.WriteLine("Солнце всходит - пора за работу!"); // и так далее Console.WriteLine("Стоп!"); IsConstructed = true; // Result(1); // это не нужно, не дело фундамента ставить флаги } }

Кастомные блоки на сайте

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


Ответ

Пример 1 с боковыми белыми блоками :after и :before
.intro { position: relative; min-height: 200px; height: 100%; width: 100%; background: transparent url(https://images.unsplash.com/photo-1432821596592-e2c18b78144f?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=3f9c78df0edb464244bbabb04d1797d8) top center no-repeat; background-size: 100%; transition: all .27s ease-in-out; } .intro:hover { -webkit-background-size: 110%; background-size: 110%; } /* Для верхнего блока */ .intro_t:before, .intro_t:after { content: ''; display: block; position: absolute; bottom: 0; width: 0; height: 0; } /* Для нижнего блока */ .intro_b:before, .intro_b:after { content: ''; display: block; position: absolute; top: 0; width: 0; height: 0; } .intro_t:before { left: 0; width: 50%; right: 50%; margin-left: 0px; border-bottom: 50px solid #fff; border-right: 50px solid transparent; } .intro_t:after { right: 0; width: 50%; left: 50%; margin-right: 0px; border-bottom: 50px solid #fff; border-left: 50px solid transparent; } .intro_b:before { left: 0; width: 50%; right: 50%; margin-left: 0px; border-top: 50px solid #fff; border-right: 50px solid transparent; } .intro_b:after { right: 0; width: 50%; left: 50%; margin-right: 0px; border-top: 50px solid #fff; border-left: 50px solid transparent; } /* Доп.стили */ body, html { margin: 0; padding: 0; background: #fff; } *, *:before, *:after { box-sizing: border-box; } .some__content { padding: 2rem; }

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, est.

Пример 2 с clip-path
.intro { display: inline-block; vertical-align: top; padding: 0; width: 100%; min-height: 250px; background: url(https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&s=61282cfeed75871385c84c2a44a8e594) bottom no-repeat; background-size: 100%; transition: all .27s ease-in-out; } .intro:hover { -webkit-background-size: 110%; background-size: 110%; } .clip-wrap-1 { -webkit-clip-path: polygon(0 0, 100% 0, 100% 200px, 60% 200px, 50% 250px, 40% 200px, 0% 200px); clip-path: polygon(0 0, 100% 0, 100% 20%, 60% 20%, 50% 30%, 40% 20%, 0% 20%); } .clip-wrap-2 { -webkit-clip-path: polygon(0 0, 40% 0%, 50% 50px, 60% 0%, 100% 0%, 100% 200px, 0% 200px); clip-path: polygon(0 0, 40% 0%, 50% 10%, 60% 0%, 100% 0%, 100% 20%, 0% 20%); } /* Доп.стили */ body, html { margin: 0; padding: 0; background: #fff; } *, *:before, *:after { box-sizing: border-box; } .some__content { padding: 2rem; }
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, est.

Как получить версию публикации ClickOnce приложения?

Требуется отображать в программе, какая версия опубликованного в ClickOnce приложения сейчас запущена. Просьба не путать с версией сборки приложения.


Ответ

Чтобы получить версию публикации ClickOnce из самого приложения, необходимо сделать три действия:
Добавить ссылку в проект на библиотеку System.Deployment.dll Подключить пространство имён:
using System.Deployment.Application; Получить версию установленной публикации:
if (ApplicationDeployment.IsNetworkDeployed) { Version version = ApplicationDeployment.CurrentDeployment.CurrentVersion; }

Закрыть Form1, открыть Form2

Да-да-да, понимаю, тема "заезжая", но сколько я не рыл, ни где толком не объясняется почему все скрывают/показывают форму так:
Form2 frm = new Form2(); this.Hide(); frm.Show();
Таким способом, активная форма не закрывается, а скрывается, правильно?
Как правильно закрыть Form1 и открыть Form2?


Ответ

В проекте WinForms есть два вида форм - главная и дочерние. Разница между ними в том, что главная форма по сути и является приложением, поэтому при ее закрытии происходит выход из приложения.
Одним из решений является скрытие главной формы, вместо закрытия. Этот вариант уже написан в вопросе. Он обычно применяется, когда главная форма так или иначе используется в дальнейшем.
Если первая форма в дальнейшем не используется, то можно использовать 2 варианта:
1. Правим Program.cs
По умолчанию содержимое файла Program.cs выглядит так:
using System; using System.Windows.Forms;
namespace WindowsFormsApplication4 { static class Program { ///

/// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }
Как вы можете заметить, Form1 запускается как приложение и, при завершении работы формы, произойдет выход из Main и приложения.
Чтобы этого не произошло, можно прописать последовательность запуска форм:
Application.Run(new Form1()); Application.Run(new Form2()); Application.Run(new Form3());
Тогда при закрытии первой формы, будет вызвана вторая и так до последней.
Недостаток - сложно передавать данные между формами. Да можно определить поля в классе Program, конструкторы с параметрами в формах и передавать данные через эти поля и параметры конструкторов, но что делать если нужно вернуться в одну из предыдущих форм? Пилить сложную логику переходов в Main - не сама лучшая идея, мягко говоря.
2. Переходим от форм к контролам
В WinForms есть замечательный класс UserControl. Это фактически пустой контрол, который вы можете наполнить любым содержимым как и форму.
После того, как набор таких контролов подготовлен, вам остается только разместить их на форме с параметром Dock = DockStyle.Fill и управляя значением свойства Conrol.Visible, показывать тот контрол, который вам нужен в данный момент. Если не хотите держать контрол в памяти, ни кто не мешает просто создавать его в нужный момент и отображать, а после использования и переключения на новый контрол, отписаться от событий, вызвать Dispose(), удалить все ссылки и отдать его на растерзание сборщику мусора. Только выигрыш от этого невелик, особенно если вдруг надумаете снова его показать.

Забыл написать про еще один недостаток переключения между формами через Main. Каждая новая форма будет открываться немного в другом месте, может для защиты от программ-автокликеров это и хорошо, но меня, как пользователя, такое поведение раздражает, и думаю что не только меня.

Ещё можно не передавать форму в Application.Run и запустить его без параметров. Тогда даже закрытие всех форм не приведёт к закрытию приложения. Чтобы выйти окончательно необходимо будет вызвать Application.Exit – Lunar Whisper
Тоже хороший вариант, если необходимо использовать разные формы в процессе работы.

Загрузка изображения в буфер

Помогите найти ошибку
package com.example.test;
import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO;
public class LoadImage {
/** подгружаем картику */
public static BufferedImage loadImage() throws IOException{
return ImageIO.read(new File ("1.bmp"));
} /** Переводим в матрицу */ public static void convertToMatrix(BufferedImage image){
int w = image.getWidth(); int h = image.getHeight();
System.out.println(w); System.out.println(h);
}
}

package com.example.test; public static void main(String[] args) { try { LoadImage.convertToMatrix(LoadImage.loadImage()); } catch (Throwable e) { e.printStackTrace(); }
}
Вот код ошибки:
javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(ImageIO.java:1301) at com.example.test.LoadImage.loadImage(LoadImage.java:16) at com.example.test.Test.main(Test.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 0
Я так понимаю, оно не видит картинку?


Ответ

Вам же всё написал компилятор.
IOException - проверяемое исключение. Вы обязаны либо обернуть его в try/catch либо дописать в функцию throws Exception. В данном примере 2 вариант не походит, поэтому пишите как-то так:
public static void main(String[] args) { try { LoadImage.convertToMatrix(LoadImage.loadImage()); } catch (Throwable e){ e.printStackTrace(); }
}

Как правильно определить правую границу формы?

Требуется перемещать элемент управления так, чтобы он не выходил за границы формы. С левой границей отследить достижение границы оказалось легко:
if (PointToClient(p).X >= 0){/*код*/ }
Но когда я пытаюсь сделать так:
int w = ActiveForm.Size.Width; if (PointToClient(p).X <= w){/*код*/ }
элемент всё равно уходит за правую границу. Т. е. Size.Width - это не правая граница формы.
В связи с этим вопрос: как определить правую границу?


Ответ

В качестве ответа могу предложить простое, «в лоб», но всё же решение в виде SLN
Там просто на форме бегает панелька, отталкиваясь от краев формы и верхней панели и проверяя, не выходят ли координаты контрола (панели) за установленные границы.

Сам код:
using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Threading;
namespace RightMargin { ///

/// Description of MainForm. /// public partial class MainForm : Form { public bool MoveActive { get; set; } public int deltaX { get; set; } public int deltaY { get; set; }
public MainForm() { InitializeComponent(); MoveActive = false; deltaX = 1; deltaY = 1; }
void buttonCloseClick(object sender, EventArgs e) { MoveActive = false; Close(); }
void ButtonStartClick(object sender, EventArgs e) { MoveActive = true; while (MoveActive) { int newX = boxPanel.Left + deltaX; int newY = boxPanel.Top + deltaY;
int maxX = ActiveForm.ClientSize.Width - boxPanel.Size.Width - 1; int maxY = ActiveForm.ClientSize.Height - boxPanel.Size.Height - 1;
//Проверка координат if (newX < 0) { newX = 0; deltaX = -deltaX; } if (newY < panelMenu.Size.Height) { newY = panelMenu.Size.Height; deltaY = -deltaY; } if (newX > maxX) { newX = maxX; deltaX = -deltaX; } if (newY > maxY) { newY = maxY; deltaY = -deltaY; }
boxPanel.Left = newX; boxPanel.Top = newY; //Thread.Sleep(2); Application.DoEvents(); } }
void ButtonStopClick(object sender, EventArgs e) { MoveActive = false; } } }

Получить SHA комитов, в которых был изменен конкретный файл

Есть ли команда в git, которая позволяет отследить, в каких комитах был изменен интересующий файл? Часто для подобных целей пользуюсь утилитой gitk, передавая единственным параметром имя файла, но было бы удобнее получить список непосредственно в терминале.


Ответ

Согласно выдаче гугла на запрос:
git get commits for file
и первой ссылке его выдачи на en-SO вам нужна вот эта команда:
git log --follow filename
Т.е. например
git log --follow c://project/how_to_use_git.txt

Как сделать длинное тире с помощью Javascript?

В HTML-разметке можно написать &ndash или &mdash.
Но если я, например, вывожу в input какой-нибудь текст с помощью js, то мнемоника не работает и воспринимается просто как набор символов:
$('button').click(function() { $('input').val('Москва - столица России'); });
Как в таком тексте, выводимом c помощью js, сделать длинное тире?


Ответ

$('button').click(function() { $('input').val('Москва \u2013 столица России'); });

Как одновременно удалить несколько локальных бранчей в git

Подскажите, как грохнуть одновременно все локальные бранчи с префиксом prj_name_
$ git branch ... * prj_name prj_name_camera prj_name_defs ...
Пробую
v.malov$ git branch -D prj_name_* error: branch 'prj_name_*' not found.


Ответ

где то так
for b in $(git branch | egrep "^prj_name_"); do git branch -D $b; done
только перед началом проверьте список бранчей на удаление
git branch | egrep "^prj_name_"
и если что, скорректируйте регулярку.

Получение ip-адреса по доменному имени

Как в Java можно легко получить ip-адрес по доменному имени хоста ?


Ответ

InetAddress.getByName("domain")
Гугл сразу ответит Вам что-то в таком духе:
https://stackoverflow.com/questions/2462398/how-to-get-the-ip-address-from-the-domain-name-in-java

Как задать условие?

Есть некий Edit Text надо задать ему условие что если прописаны 3 букы стартовал My methoв; а если поле сново будет пустым то вернулся в начальное положение


Ответ

editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if (charSequence.length() == 3){ // здесь вызывыете My method } if (charSequence.length() == 0) { // здесь возвращаетесь в начальное состояние } }
@Override public void afterTextChanged(Editable editable) { } });

Как обрезать текст после последнего слеша на C#?

Есть строка
C:\Folder1\SubFolder1\SubFolder2\SubFolder3
Мне надо обрезать всё за последним слешем и получить
C:\Folder1\SubFolder1\SubFolder2
Как это реализовать?


Ответ

Вапиант 1:
var path = @"C:\Folder1\SubFolder1\SubFolder2\SubFolder3"; var result = System.IO.Path.GetDirectoryName(path);
Для справки: GetDirectoryName
Вариант 2:
var path = @"C:\Folder1\SubFolder1\SubFolder2\SubFolder3"; int pos = path.LastIndexOf("\\"); // позиция последнего слеша var result = path.Remove(pos, path.Length - pos);
Результат:
C:\Folder1\SubFolder1\SubFolder2

Примонтировать раздел в readonly-режиме

При попыткие примонтировать раздел через интерфейс проводника получаю ошибку
Не удалось присоединить Data E Error mounting /dev/sda9 at /media/qwertiy/Data E: Command-line `mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" "/dev/sda9" "/media/qwertiy/Data E"' exited with non-zero exit status 14: The disk contains an unclean file system (0, 0). Metadata kept in Windows cache, refused to mount. Failed to mount '/dev/sda9': Operation not permitted The NTFS partition is in an unsafe state. Please resume and shutdown Windows fully (no hibernation or fast restarting), or mount the volume read-only with the 'ro' mount option.
Пытаюсь выполнить в командной строке (добавил -o ro) в команду из сообщения выше
sudo mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" -o ro "/dev/sda9" "/media/qwertiy/Data E"
но получаю ошибку
fuse: failed to access mountpoint /media/qwertiy/Data E: Нет такого файла или каталога
Что я делаю не так? Как примонтировать диск для чтения без перезагрузки в винду?


Ответ

Надо попробовать НЕ монтировать в /mnt и /media - эти каталоги используются (в той же бубунте больше media) для временного монтирования внешних накопителей. В более старых версиях была схема /media/метка-тома-или-его-uuid. Сейчас /media/$USER/метка-тома-или-его-uuid. Все подкаталоги создаются и удаляются ОС автоматом. Создавать папки там - чревато вероятными конфликтами имён и ugo. Ещё в старых мануалах за 2007-2009е говорилось, что лучше не надо. 99,9% сработает такой вариант:
godmode:
sudo -i
Создаём принудительно будущую точку монтирования:
mkdir -p /windows/e
Монтируем раздел на чтение\запись:
ntfs-3g /dev/sda9 /windows/e
Если надо только смотреть, то как-то так:
ntfs-3g -o ro /dev/sda9 /windows/e
Если надо монтировать при старте системы - вот так работает на ubuntu 12.04, 14.04, 16.04. Строка добавляется в /etc/fstab
UUID=0B0525B62F08257C /windows/F ntfs-3g users,locale=ru_RU.UTF-8,nobootwait 0 0
UUID узнаётся через sudo blkid

Паттерн “Посетитель”. Java

В первый раз реализую, и что-то не заработало.
public interface FieldVisitor { Object visit(Field field); }
А это методы из реализации:
private FieldVisitor factory = new FieldVisitor() { public Object visit(PresetField presetField) { .... }
public Object visit(StringField stringField) { .... }
@Override public Object visit(Field field) { System.out.println(field.getClass()); .... } };
Вызываю так:
public Node getFieldFor(Field field) { return (Node) factory.visit(field); }
Видно что приходят объекты разных классов:
class com.dma.params.model.field.PresetField class com.dma.params.model.field.PresetField class com.dma.params.model.field.NumberField class com.dma.params.model.field.NumberField class com.dma.params.model.field.StringField class com.dma.params.model.field.BooleanField
Однако попадаю как видно только в метод для суперкласса. В общем, как я понял, какой тип указателя, такая функция вызывается. Я могу как то изменить это поведение? Чтобы вызывалась функция для фактического типа или я где-то тупанул с паттерном?


Ответ

Потому что всё совершенно не так.
Во-первых интерфейс визитёра должен объявлять методы для всех классов иерархии
public interface FieldVisitor { Object visit(PresetField field); Object visit(StringField field); ... }
Во-вторых родоначальник иерархии объявляет абстрактный метод accept, в котором принимается визитёр
class Field { ... public abstract void accept(FieldVisitor visitor); ... }
В-третьих конкретные такие потомки реализуют/переопределяют метод-акцептор таким образом, чтобы вызывался метод визитёра для нужного (своего) класса
class StringField { ... @Override public abstract void accept(FieldVisitor visitor) { visitor.visit(this); // вызов visit(StringField field) } ... }
Наконец визитёр может посетить иерархию, предварительно реализовав интерфейс визитёра вызовом акцептора
... field.accept(new FieldVisitor() { @Override Object visit(PresetField field) { ... }
@Override Object visit(StringField field) { ... }
}); ...
Благодаря полиморфизму вызывается accept конкретного класса, который в свою очередь вызывает "свой" перегруженный метод визитёра.

Как при клике показать другую половину div?

Добрый день! Как сделать, что при начальном состоянии показывалось 50% этого div, а после нажатия на кнопку показывалась другие 50%?

Ещё


Ответ

Если допускается использование jquery, то можно так:
$(function(){ var h=$(".hide").height(); //получаем высоту блока с контентом $(".hide").css({"height": h/2}); //устанавливаем высоту блока с контентом в 50% $(".button").click(function(){ //нажатие на кнопку if(h==$(".hide").height()){ //если высота блока на момент нажатия на кнопку равно изначальной высоте блока то $(".hide").css({"height": h/2}); //устанавливаем высоту блока в 50% от изначальной } else { //иначе $(".hide").css({"height": h}); //устанавливаем высоту блока в 100% } }); }); .hide { overflow: hidden; }


Switch-on-strings Java7 - архив переписки JSR 334

Здравствуйте. Может ли мне кто-нибудь объяснить небольшой момент в переписки, касательно критики и предложений данного нововведедения switch-on-strings в 7 пакете Жабы, в 334 coin project 334 JSR ?
процитирую:
Now that we plan to have closures, do we still need strings-in-switch? Won't a string-to-function map be about as fast (though maybe less convenient)? I don't know what the use cases are for strings-in-switch, but the feature already felt a bit low-benefit to me, and seems even more so now with closures.
ссылка на источник
Что такое понятие closures, и почему в случае его реализации, задается вопрос, существует ли необходимость в данной опции-свичире ? Какая между ними связь, объясните для непонимающего. И так же на счет вопроса не будет ли string-to-function map не менее быстрым.
Может кто небольшое введение сделать для понимания данного коммента ? Буду благодарен.


Ответ

Могу ошибаться, но мне кажется, здесь речь идет о замыканиях, т.е. лямбдах.
Пример, где switch может быть заменен лямбда-функцией.
public static String caseOnString(String str) { switch (str) { case "hello": return "world"; case "bye": return "country"; default: return ""; } }
public static String mapOnString(String str) { Function map = s -> { if (s.equals("hello")) return "world"; if (s.equals("bye")) return "country"; return ""; };
return map.apply(str); }

Enum и как его выводить в массив?

Ну есть Enum в которой 3 переменные Moдerator Inkvizitor и God. Как мне вывести их значения в массив? И обладает ли enum какими-то привилегиями в отличии от class-а или недостатками, потому что оба имеют поля и можно писать в них методы.


Ответ

Можно воспользоваться методом YourEnum.values() для получения массива всех возможных вариантов перечисления.
Перечисление удобнее класса тогда, когда вы планируете не расширяемое количество экземпляров объекта. Например перечисление хранящее пол человека Sex.Male и Sex.Female. Также перечисления могут иметь методы, например:
enum Sex { MALE, FEMALE;
public String prefix() { return this == MALE ? "mr." : "mrs."; } }
или
enum Sex { MALE { public String prefix() { return "mr."; } }, FEMALE { public String prefix() { return "mrs."; } };
public abstract String prefix(); }

В чем ошибка при перегрузке оператора+?

Перегружаю бинарный + в своем классе:
MyClass operator+(const MyClass &a, const MyClass &b) { ... return a.value + b.value; }
Получаю ошибку бинарный оператор + имеет слишком много параметров. В чем проблема? Везде указывается именно такая сигнатура перегрузки этого оператора.


Ответ

Каждая не статическая функция-член класса имеет неявный параметр, который получает значение this, то есть указатель на сам объект класса.
Вам надо либо этот оператор определить в классе как дружественную функцию (если требуется обращение к закрытым или защищенным членам класса), например
friend MyClass operator+(const MyClass &a, const MyClass &b) { ... return a.value + b.value; }
Или объявить ее как обычную функцию вне класса, если не требуется обращение к закрытым или защищенным членам класса.
Либо сделать оператор функцией-членом класса, но с одним явным параметром
MyClass operator+( const MyClass &b) const { ... return this->value + b.value; }

Вызов .ToString()

string s = null; Console.WriteLine(Convert.ToString(s));//1 Console.WriteLine(s);//2 Console.WriteLine(s.ToString());//3
Почему в первом случае не выдает NULL reference? Почему во-втором случае не выдает NULL reference? Если я, не ошибаюсь, то в методе Console.WriteLine() ко всем переменным вызывается метод .ToString() не явно. Почему когда явно указываю .ToString() выдает NULL reference? Можно ссылки по данным вопросам или ключевые слова для поиска нужной информации.
Вот il-код программы:
IL_0000: nop IL_0001: ldnull IL_0002: stloc.0 IL_0003: ldloc.0 IL_0004: call string [mscorlib]System.Convert::ToString(string) IL_0009: call void [mscorlib]System.Console::WriteLine(string) IL_000e: nop IL_000f: ldloc.0 IL_0010: call void [mscorlib]System.Console::WriteLine(string) IL_0015: nop IL_0016: ldloc.0 IL_0017: callvirt instance string [mscorlib]System.Object::ToString() IL_001c: call void [mscorlib]System.Console::WriteLine(string) IL_0021: nop IL_0022: ret


Ответ

По поводу вывода null через Console.WriteLine(), MSDN говорит
If value is null, only the line terminator is written to the standard output stream.
То есть Console.WriteLine(null) выводит один лишь перевод строки. Это объясняет пример (2). В этом случае Console.WriteLine согласно документации не имеет права тупо вызывать ToString (тем более что мы вызвали перегрузку со строкой, там конвертация точно не нужна). Для того, чтобы соответствовать документации, функция обязана проверять свой аргумент на null. Это можно увидеть прямо в исходниках текущей версии .NET
if (value==null) { WriteLine(); } else { ...

Далее, согласно документации на Convert.ToString(string s), значение не меняется:
value is returned unchanged.
Поэтому Convert.ToString(s) возвращает null, а уж вывод null работает без проблем, как и в примере (2). Это объясняет пример (1).

Ну и наконец пример (3), вызов s.ToString() есть вызов метода по null-ссылке, который закономерно ведёт к NullReferenceException

Легкий паралакс

Добрый день, подскажите, вероятно у кого-нибудь есть на примете паралакс, только что бы он несильно ресурсоемкий был, лайт скажем так, может кроссбарузерная реализация на css. И может есть на примете похожий плагин для реализации эффекта как на первом экране, движение мыши приводит в действие 5 блоков с информацией.


Ответ

По parallax эффекту:
$(document).ready(function() { var wHeight = $(window).height(); function parallax() { var pHeight = $(this).outerHeight(); var pMiddle = pHeight / 2; var wMiddle = wHeight / 2; var fromTop = $(this).offset().top; var scrolled = $(window).scrollTop(); var speed = $(this).attr('data-parallax-speed'); var rangeA = (fromTop - wHeight); var rangeB = (fromTop + pHeight); var rangeC = (fromTop - wHeight); var rangeD = (pMiddle + fromTop) - (wMiddle + (wMiddle / 2)); if (rangeA < 0) { rangeA = 0; rangeB = wHeight } var percent = (scrolled - rangeA) / (rangeB - rangeA); percent = percent * 100; percent = percent * speed; percent = percent.toFixed(2); var animFromBottom = (scrolled - rangeC) / (rangeD - rangeC); animFromBottom = animFromBottom.toFixed(2); if (animFromBottom >= 1) { animFromBottom = 1; } $(this).css('background-position', 'center ' + percent + '%'); $(this).find('.parallax-content').css('opacity', animFromBottom); $(this).find('.parallax-content').css('transform', 'scale(' + animFromBottom + ')'); } $('.parallax').each(parallax); $(window).scroll(function(e) { $('.parallax').each(parallax); }); }); body { margin: 0; padding: 0; height: 800px; } .main-slide { width: 100%; height: 100vh; margin-bottom: 400px; }


Тут можно посмотреть.
Что касается движения блоков, то я обычно использую jParallax для таких решений.
http://stephen.band/jparallax/

Как использовать git, чтобы хранить проекты на разных хранилищах?

Как использовать git, чтобы хранить две проекты на github и bitbucket? Не хочется ставить еще один клиент git. Использую GUI-клиент GitHub, а также консольное окно github.


Ответ

Чтобы хранить один и тот же репозиторий на разных серверах вам не нужен другой клиент Git. Достаточно добавить их у себя в remotes:
git remotes add github https://github.com.... git remotes add bitbucket https://bitbucket.org....
И когда будете делать push/pull, дубрируйте для каждого remote:
git push github master; git push bitbucket master;
И почитать это в первую очередь.

Количество сколько байтов в поле mysql таблицы

CREATE TABLE `NewTable` ( `usname` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPACT ;
Если в поле будут введены не utf-8 символы, то максимум 32 символа можно хранить в этом поле.
А если в поле будут utf-8 символы, то и utf-8 можно 32 шт сохранять в этом поле.
Сколько байт будет занимать поле если в нем только utf-8 символы?
И сколько байт, если на utf-8 символы будут хранится в нем?
Режим traditional как-то влияет на это?

Изменил заголовок: добавил слово "сколько" - для автопоиска, если кто-то будет задавать схожий вопрос.


Ответ

Циферка в скобках varchar указывает именно число символов используемой кодировки. Длина в байтах напрямую зависит от используемой для поля кодировки CHARACTER SET
Для utf8 mysql использует максимум 3-байтовое представление. Поэтому varchar(32) будет занимать до 3 * 32 = 96 байт сами данные, плюс 1 или 2 байта на хранение длины данных в байтах. 96 меньше 255, поэтому требуется 1 байт. Итого такой varchar будет занимать от 1 до 97 байт на диске.
Интересный момент, что в индексе и всяких сортировках/группировках в памяти это поле всегда развёрнуто до максимальной байтовой длины.
Внимательный читатель может удивиться ещё одному моменту - ведь utf может занимать до 4 байт. А mysql под utf8 умеет хранить только 3 байта. Да, utf8 в остальном мире и utf8 в mysql - разные вещи. При попытке записать 4-байтный utf8 (именно в 4 байте размещены модные нынче смайлики, т.е. это совсем не экзотика мёртвых языков, а реально встречаемые данные) mysql вернёт ошибку и ничего не запишет. Для полноценного utf8 в mysql 5.5 добавлена кодировка utf8mb4
А utf8mb4 использует уже до 4 байт на символ. Что немного изменяет результат байтовой длины: 32 символа будут занимать до 32*4 = 128 байт, плюс один на хранение длины строки.

Файлы в одной папке не индексируются и не отправляются на GitHub

Прошу подсказать.
Заливал проект Asp.Net MVC через Git Bash на GitHub. Но ключевая папка проекта почему-то копируется без файлов, т.е. пустая папка. Остальные файлы проекта, включая другую папку копируются нормально. Скрин прилагаю.
Также прилагаю скрин, что папка DataProject не хочет индексироваться, точней файлы внутри неё -
В чем проблема? Я писал все как в инструкции:
git add . git commit -a"name" git push
Также пробовал заходить отдельно в папку DataProject и там прописывать git add .; git commit , выходил на уровень выше проверял статус и красное пропадало.....но файлы по-прежнему на ГитХаб не загружались. Поодскажите, пож-т.


Ответ

В чём причина такого поведения
Вот эта строка:
modified: DataProject (modified content)
Указывает на то, что папка DataProject — это ещё один репозиторий внутри основного репозитория. Это называется субмодуль (submodule). Гитхаб показывает субмодули специальной серой иконкой:

Субмодуль — это полностью самостоятельный репозиторий. У него свои данные, свои коммиты, своя история. Внешний, «родительский» репозиторий не может сохранять изменения файлов внутри субмодуля. Он знает (сохраняет в своих коммитах) только следующее:
В каком пути лежит субмодуль (например, корень проекта/DataProject). На какой коммит субмодуля нужно смотреть.
Похоже, что у вас такая структура:
~/Downloads/DataProject # это ваш проект | → ~/Downloads/DataProject/DataProject # а это субмодуль внутри него → ~/Downloads/DataProject/packages # просто папка
Скорее всего субмодуль здесь не нужен, и вы его добавили по ошибке.
Обратите внимание: папка packages не должна сохраняться в репозитории — добавьте её в gitignore. (Спасибо Pavel Mayorov за наблюдательность)
Как починить репозиторий
Правильный путь — удалить субмодуль
Инструкция здесь: Как удалить субмодуль?
Простой путь — начать заново
Если вы только начали работу над проектом, можно удалить историю Git и создать новый репозиторий. Все ваши файлы останутся на месте. Если беспокоитесь — сделайте бэкап в новую папку или архив.
Удалите старый репозиторий:
cd ~/Downloads/DataProject # Удаляем репозиторий rm -rf .git # И файл с конфигурацией субмодуля. rm -f DataProject/.git # И список субмодулей rm -f .gitmodules Теперь заново инициализируем репозиторий. Убедитесь, что вы находитесь в той же папке!
git init Добавьте файл .gitignore для VS в корень проекта. Теперь лишние файлы не будут сохраняться в Git. Сохраните .gitignore в коммит:
git add .gitignore git commit -m'add gitignore' Добавьте оставшиеся файлы.
git add . git commit -m'message' Теперь снова настройте удалённый репозиторий и перепишите его новой историей.
git remote add <адрес удалённого репозитория на гитхабе> git push -uf origin master:

Не могу сделать push в чужой репозиторий: “already up-to-date”

Меня добавили в репозиторий (дали права на коммит, пуш).
Сделал клон этого репозитория, создал ветку, закоммитил изменения.
Пытаюсь сделать git push, чтобы на удалённом появилась моя новая ветка со всеми изменениями.
Ввожу мэйл, пароль, в ответ приходит "already up-to-date". Данных на удаленном нет...
Что я делаю не так?


Ответ

already up-to-date
Это означает что:
На том сервере, куда вы пушите, уже есть такая ветка И эта ветка находится в таком же состоянии (т.е. точно на тот же коммит смотрит).
Варианты:
Вы пушите не туда (а в какой-то другой репозиторий). Проверяется командой
git remote -v Вы пушите не то что нужно (а например свою ветку master). Предположим, нужные коммиты у вас в ветке mybranch
git checkout mybranch # проверим, что коммиты на месте git log git push -u origin mybranch
Можно обойтись без checkout и сразу выбрать, что и куда пушить
git push -u origin mybranch:mybranch Вы сделали коммиты не в ту ветку.
создал ветку, закоммитил изменения.
Довольно частая ситуация: разработчик создал ветку, но не переключился на неё. Проверяется просто:
# проверим, что коммиты на месте git log mybranch
Если оказалось, что коммиты, например, в master, а должны быть в mybranch
git checkout mybranch git reset --hard master # теперь пробуем пушить git push -u origin mybranch
# а теперь вернём свой master на тот же коммит, который на удалённом сервере git checkout master git reset --hard origin/master # заодно можно его обновить git pull

Как понять начертание текста внутри docx файла используя c#?

Как понять начертание текста на c#? Мне нужно определить как написан текст:
Курсивом Жирным Подчеркнутым Надчёркнутым Перечеркнутым
Как собственно распознать начертание на c#, если текст берется из файла word?
StreamReader readLorem = new StreamReader(@"lorem.docx");
StreamWriter writeEncrypt = new StreamWriter(@"encrypt.docx");
StreamWriter writeDecrypt = new StreamWriter(@"decrypt.docx");
public Bacon() { InitializeComponent(); }
private void Bacon_Load(object sender, EventArgs e) { string lorem = readLorem.ReadToEnd(); }
Такой код не сохраняет начертание.


Ответ

Как ранее отмечали, можно воспользоваться библиотекой OpenXML от Microsoft, которую можно скачать тут. Итак после установки в Ваш проект нужно подключить следующие сборки:
DocumentFormat.OpenXml WindowsBase
Для работы с текстом нужно подключить пространства имён:
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing;
Я создал для демонстрации небольшое консольное приложение для примера, ниже расположена функция, которая разбирает форматирование текста, который содержится в файле по пути path. Эта функция отображает текст из документа и параметры форматирования каждого участка текста:
static void ReadDocx(string path) { try { using (var doc = WordprocessingDocument.Open(path, false)) { foreach (var p in doc.MainDocumentPart.Document.Body.Elements()) { foreach (var r in p.Elements()) { Console.WriteLine(r.InnerText); Console.WriteLine("Является:"); if (r.RunProperties.Bold != null) Console.WriteLine("Жирный"); if (r.RunProperties.Italic != null) Console.WriteLine("Курсив"); if (r.RunProperties.Underline != null) Console.WriteLine("Подчёркнутый"); if (r.RunProperties.Strike != null) Console.WriteLine("Перечеркнутый"); if (r.RunProperties.VerticalTextAlignment != null) { if (r.RunProperties.VerticalTextAlignment.Val == VerticalPositionValues.Subscript) Console.WriteLine("Подстрочный"); if (r.RunProperties.VerticalTextAlignment.Val == VerticalPositionValues.Superscript) Console.WriteLine("Надстрочный"); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }

Подклчить колонки к двум источникам

Хочу подключить колонки к двум источникам звука одновременно. Будут они воспроизводить одновременно оба источника или будет некий способ переключения между ними (типа выключателя) не важно.
Нагуглил, что самый простой (варварский) метод - просто спаять провода. Но паять ничего не собираюсь. Можно ли найти подходящее готовое устройство? Т. е. либо просто что-то типа разветвителя, но наоборот, либо оно же, но с переключателем. Никаких дополнительных наворотов не надо. Кстати, как такая штука называется?
Также пришло в голову использовать адаптер для объединения наушников и микрофона - типа того, что на фото. Что будет, если оба его конца воткнуть в источники звука, а в него воткнуть колонки? Или нужно что-то другое?


Ответ

Если просто "спаять" ничего хорошего не выйдет. Выход оконечного усилителя заточен под периферию определённого реактивного сопротивления(Выход на колонки обычно 4 Ω, на наушники порядка 16 Ω/32 Ω/300 Ω).
Рассогласование выходного сопротивления с сопротивлением нагрузки резко ухудшает качество усиления, потому что выходные каскады усилителей меняют режим работы(вплоть до выхода из строя!). В вашем случае, нужно ещё учитывать взаимное влияние источников звука.
Вам нужно таки определиться, что вам нужно:
Микшер источников звука Переключатель источников звука:
С переключателем всё намного проще - в каждый момент времени работает только одна нагрузка. Его даже можно включать в обратном направлении :)

Задание с собеседования - объяснить почему не работает код [закрыт]

Знакомому на собеседовании дали задание, объяснить почему не работает код, в общем, собеседование он так и не прошел, а над тестовым заданием мы решили вместе посидеть, своими силами ни к какому толковому результату не пришли, может вы сможете подсказать что тут не так. Код компилируется, но ниразу не выполняется.
class MiddleTask { delegate bool Comparer(int a, int b); delegate void Executer(string message); static int MaxValue(int a, int b, Comparer comp) { return comp(a, b) ? a : b; } static void TExecute(int cicle, Executer method) { var inc = 0; while (inc <--cicle) { method("Execute method-comparer"); } }
static void Main(string[] args) { Trace.WriteLine("Entry point..."); TExecute(3, (dy) => { var targetRangeModel = new { range = 0, comparerPrefix = "Compare result:" };
var index = 0; var target = 20;
while (index-- > targetRangeModel.range && target-- > index) { Trace.WriteLine(targetRangeModel.comparerPrefix + ">>>" + MaxValue(22, 15, (x, y) => { return (x > y) ? true : false; } ) ); } });


Ответ

У вас ни разу не выполняется цикл
while (index-- > targetRangeModel.range && target-- > index)
Т.к. условие index-- > targetRangeModel.range всегда будет ложно

Что происходит в компиляторе?

Исходный текст программ на Java состоит из совокупности пробелов, идентификаторов, литералов, комментариев, операторов, разделителей и ключевых слов.
Что происходит в компиляторе с каждым из выделенных понятий? Что-то отсеивается или как-то видоизменяется?


Ответ

Обычная практика при написании компилятора — разделение его на части. Традиционно, первая часть — лексический анализ, деление исходного текста на лексемы. Это означает, что код читается как последовательность символов, и представляется в виде последовательности токенов
Токен состоит из типа токена и значения (упакованы в один класс).
При этом обычно пробелы (не являющиеся частью символьных/строковых литералов) отбрасываются, идентификаторы превращаются в токен типа «Идентификатор» со значением, равным строке с именем идентификатора. Литералы также превращаются в токены. Комментарии стадию лексического анализа обычно не проходят и просто отбрасываются. Разделители, наподобие скобок и знаков препинания, образуют каждый собственный тип токена. Ну и для ключевых слов тоже обычно выделяют по отдельному типу токена.
Пример:
Исходный текст
public class Example { // пример public static void main(String[] args) { System.out.println(/* этот текст будет напечатан*/"hello world"); } }
производит такую последовательность лексических токенов:
[public-keyword] [class-keyword] [ident "Example"] [separator-left-brace] [public-keyword] [static-keyword] [void-keyword] [ident "main"] [separator-left-paren] [ident "String"] [separator-left-brack] [separator-right-brack] [ident "args"] [separator-right-paren] [separator-left-brace] [ident "System"] [separator-dot] [ident "out"] [separator-dot] [ident "println"] [separator-left-paren] [string-literal "hello world"] [separator-right-paren] [separator-semicolon] [separator-right-brace] [separator-right-brace]
Дальнейшие фазы компиляции разобьют это на определения классов, функций, и операции, проверят соответствие имён, привяжут имена к объектам, проверят на осмысленность, проведут оптимизацию и скомпилируют в байт-код.
Лексический анализ — самая простая фаза компиляции.

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

WPF в С# проблема с custom

Есть код XAML и есть класс CustomVisualFrameworkElement, который унаследован от FrameworkElement и реализует с помощью Visual некоторые фигуры. Но XAML почему то не видит данный класс, хотя я подключаю пространство, которое содержит класс CustomVisualFrameworkElement
КОД XAML:
//Вот тут не видит класс


Ответ

Если с кодом всё в порядке, помогает следующий алгоритм:
Убрать из XAML Перекомпилировать проект и убедиться, что он компилируется без ошибок, Добавить назад.
Разоблачение магии: WPF компилирует проект в два прохода: сначала XAML (при этом генерируется код на C#), потом весь code-behind. Если у вас есть свежий класс в code-behind, который упомянут в XAML'е, то при компиляции XAML'а его ещё не видно, и первый этап компиляции проваливается. Убирая новый элемент, мы даём первому этапу компиляции завершиться, и компилятор наконец-то видит новый класс.
Да, это баг в Visual Studio.

Почему высота строчного элемента 26 пикселей, хотя font-size равен 24 пикселя?

Привет.
Вопрос по CSS. Я написал Ёу , а потом открыл девтулс и выдели этот строчный элемент. Получил это:

Не понимаю, что это за выделенная область? Что за 26 пикселей, когда я указал 24 пикселя?. У строчного элемента есть строчный блок (равен высоте line-height), есть область содержимого (равна font-size), есть контейнер строки.
Модель 1

У элемента есть область содержимого - это из модели контейнеров. Насколько я понимаю, на строчные элементы модель контейнеров тоже распространяется, так как можно те же margin, border, padding задать для строчного элемента. Как эти две модели взаимодействуют?
Модель 2

У модели контейнеров есть "область содержимого" и у модели чисто строчных элементов есть область содержимого (ее высота определяется как font-size).


Ответ

Свойство font-size задает размер кегельного квадрата по высоте. Потом берется шрифт, который соответствует этому кегельному квадрату по высоте. Глифы шрифта могу по высоте вылезать за эти кегельные квадраты В девтулсе синим выделяется область содержимого (content area) строчного элемента. Это прямоугольник. Согласно книге Эрика Мейера "CSS", в стандарте CSS 2.1 (страница 216 книги) есть два варианта того, как образуется content area: а) В своей книге он выбрал для простоты вариант, когда content area по высоте определяется размерами кегельных площадок по высоте, которое определяется, как уже написал, свойством font-size. б) content area - это самый маленький прямоугольник, который охватывает все глифы строки по высоте. В браузерах используется именно этот метод определения content area. Глифы шрифта больше, чем кегельная площадка (которую определяет font-size), поэтому content-area (наименьший прямоугольник, который охватывает глифы) больше, чем font-size

Параллельное обновление таблицы

Допустим, есть процедура, которая содержит в себе запрос вида:
UPDATE TOP (1) table SET SessionId=@SessionId Where SessionId is null
Если эту процедуру будут запускать параллельно несколько пользователей, то не будет ли коллизий в том, что одном и тот же юзер проапдейтит одну и туже запись или MS SQL сервер позаботится, что бы такой ситуации не возникло?
Если такое имеет место быть, то как этого избежать?


Ответ

Такая конструкция потокобезопасна.
или MS SQL сервер позаботится, чтобы такой ситуации не возникло?
Если кратко, то - да. Если одна сессия (имеется ввиду SQL-сессия) выбрала запись в таблице для обновления, то параллельная сессия не сможет (из-за установленной первой сессией U-блокировки) выбрать и обновить ту же самую запись (если я правильно понял - это то, что интересует). Пример с пояснениями - ниже.

Пусть есть таблица:
CREATE TABLE LockTest ( Id int identity not NULL primary key, SessionId uniqueidentifier NULL );
Добавим в неё немного данных:
INSERT INTO LockTest (SessionId) VALUES (NULL), (NULL), (NULL), (NULL), (NULL);
Пару раз выполним запрос:
DECLARE @sessionId uniqueidentifier = newid();
UPDATE TOP (1) LockTest SET SessionId = @sessionId WHERE SessionId IS NULL;
Выполним запрос на обновление в третий раз, запустив, предварительно профилировщик, и посмотрим какие происходят блокировки:

(для полноты понимания происходящего желательно, конечно, иметь представление о режимах, гранулярности и совместимости блокировок).
Происходит примерно следующее. SqlServer сканирует кластерный индекс в поисках записи, у которой SessionId является NULL. При этом для каждой записи поочередно:
ставится U-блокировка на запись (чтение с возможным изменением данных) происходит проверка условия SessionId IS NULL если запись не удовлетворяет условию, то блокировка снимается и происходит переход к следующей записи (на снимке экрана - это Acquired-Released пары U-блокировок записей со значениями хэшей ключа (8194443284a0) и (61a06abd401c)) если запись удовлетворяет условию (запись со значением хэша ключа (98ec012aa510)), то блокировка повышается до монопольной (X-блокировки), запись обновляется, после чего блокировки снимаются
Параллельная сессия не сможет обновить ту же самую запись, т.к. для этого ей придётся точно также установить U-блокировку на ту же самую запись. Однако две U-блокировки несовместимы, поэтому параллельной сессии придётся ждать, пока мы обновим запись и/или снимем блокировку. Тогда же, когда блокировка нами будет уже снята, SessionId у записи станет не NULL. Вследствие чего параллельной сессии придётся искать следующую "свободную" запись.
Картина происходящего может несколько меняться в зависимости от наличия или отсутствия индекса на столбце SessionId. От того, будет ли проиcходить lock-escalation (для TOP (1), наверное, не должно). Однако характер происходящего, - установка U-блокировки на кандидата и её освобождение, если запись не подошла, либо преобразование в X-блокировку, если запись выбрана, с последующим освобождением, - скорее всего будет сохраняться.

Как обратиться к div внутри div

Здравствуйте.
Есть блок и внутри него ещё два блока. Хочу чтобы первый внутренний блок занимал левую часть экрана (50% экрана), а второй блок правую (50% экрана). Пробовал сделать сам, но так и не получилось. Не могу достучаться до div'ов внутри #father
Пример:
#son { height: 400px; width: 300px margin-left: auto; } #daughter { height: 400px; width: 300px margin-right: auto; }

....
....

Заранее спасибо.


Ответ

#son{ display: inline-block; height: 400px; width: 300px; background-color: #3498DB; margin: 0px; padding: 0px; } #daughter{ display: inline-block; height: 400px; width: 300px; background-color: #E74C3C; margin: 0px; padding: 0px; }


Смена картинки по клику с помощью метода attr()

Всем доброго дня.
Есть такой скрипт: Необходимо сделать смену картинок по клику. Нашла в сети пример и написала код по нему. У меня он не работает и в консоли выводит ошибку. Скажите пожалуйста как можно исправить код? Для более лучшего понимания поясню - .slide-225 - мой класс картинки, и src - пути изображений которые я пытаюсь заменить. Буду рада любому замечанию и совету:)
$(".slide-225").bind("click", function() { var src = ($(this).attr('src="/wp-content/uploads/2017/01/Mirdif-2-960x640.jpg"') === "Mirdif-2-960x640.jpg") ? "Mirdif-full-960x640.jpg" : "Mirdif-2-960x640.jpg"; $(this).attr('src="/wp-content/uploads/2017/01/Mirdif-2-960x640.jpg"', src); });


Ответ

Вы не правильно получаете и записываете атрибут.
Для получения используется запись такого типа: $(element).attr(attribute); Для назначения используется запись такого типа: $(element).attr(attribute, value);
В любом случае, название атрибута и его значение указывается в кавычках, если конечно, вы не указываете название атрибута или его значение переменной или каким-то вычислениями в JS
Исправленная версия:
$(".slide-225").bind("click", function() { var src = $(this).attr('src') ? "Mirdif-full-960x640.jpg" : "Mirdif-2-960x640.jpg"; $(this).attr('src', src); });

Пересечение отрезка и эллипса

Дан отрезок из двух точек А и В (у каждой точки есть координаты).
Дан эллипс (пока что задаю верхней левой точкой, длиной и шириной, но при необходимости эти параметры можно заменить на любые другие).
Задача: узнать пересекаются ли отрезок с эллипсом. Случай, при котором отрезок полностью в эллипсе не удовлетворяет условие.
Помогите, пожалуйста, а то ничего в голову не приходит. Если возможно, то нужен код в java, если нет - дайте решение, а код напишу сам.


Ответ

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

Вариант, с помощью которого не нужно решать уравнения (без использования численных методов):
Пусть задан эллипс:
(x-x0)^2/a^2 + (y-y0)^2/b^2 = 1
, где:
(x0;y0) – координаты центра эллипса; a и b – длины большой и малой полуосей соответственно.
и отрезок AB, где A(x1;y1) и B(x2;y2)
Для того, чтобы отрезок AB пересекал заданный эллипс, необходимо и достаточно, чтобы была верна одна из систем неравенств:
(x1-x0)^2/a^2 + (y1-y0)^2/b^2 < 1 (x2-x0)^2/a^2 + (y2-y0)^2/b^2 > 1
(случай, когда точка A лежит внутри эллипса, а B – вне его);
(x1-x0)^2/a^2 + (y1-y0)^2/b^2 > 1 (x2-x0)^2/a^2 + (y2-y0)^2/b^2 < 1
(случай, когда точка A лежит вне эллипса, а B – внутри его).
Если интересует случай с принадлежностью точек дуге эллипса, то в вышеприведенных системах неравенства будут нестрогие.

Какое отличие между std::move и приведением к (T&&)?

Скажите, в чем разница если написать T&& вместо std::move? Вот код:
template void swap(T &a, T& b) { T t{ std::move(a) }; a = (T &&)(b); b = std::move(t); }
В данном случае так же будет вызван перемещающий оператор = (во всяком случае эффект тот же что и от std::move). Скажите, в чем отличие от варианта строкой ниже с std::move?


Ответ

Согласно Стандарту языка шаблонная функция std::move(T&& t) возвращает
static_­cast&&>(t)
Т.е. пока шаблонная функция имеет T& в сигнатуре - разницы Вы не увидите. Но если функция будет принимать T&& аргумент, то результат уже будет иной:
#include #include
template void fr(T& a) { std::cout << "& " << std::is_same_v << "
"; }
template void frr(T&& a) { std::cout << "&& " << std::is_same_v << "
"; }
int main() { int i = 42; fr(i); frr(i); }
Вывод
& 1 && 0
Происходит это потому, что для frr тип T выводится как int&, и запись вида T&& превращается в int&&&, что в свою очередь снова даёт int&, а не int&&
Мой код использует конструкции из c++17, поэтому если нужно, чтобы он собирался в c++11 надо заменить std::is_same_v на std::is_same::value

Ошибка Json при обращении к vk: JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Код:
import requests result = requests.get('https://vk.com/dev/users.get',params={'user_ids':1}) print(result.json())
Вывод:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
В чем проблема?


Ответ

Вы выполняете запрос не в API, а на страницу документации.
Запрос в API выглядит примерно так:
https://api.vk.com/method/users.get?user_id=210700286&v=5.52
Ответ:
{ "response": [ { "id": 210700286, "first_name": "Lindsey", "last_name": "Stirling" } ] }

ArrayList не клонируется

Здравствуйте,
Пытаюсь клонировать ArrayList со всеми переменными. В итоге изменяю значения градусов в новом листе. И автоматически изменяются данные в старом листе. Хотя использую пример, в котором данные старого листа должны остаться неизменными.
ArrayList celsius = new ArrayList(); ArrayList fareng = (ArrayList) celsius.clone();
for(HeatSensor h: fareng) { double far = h.getCelsius(); far = 9*far/5 + 32;
h.setCelsius(far);
System.out.println(h.toString()); }
Чтобы было понятнее, вот что выводится на экран:
================celsius============================ Heat : 70.0, 1/02/2017 Heat : 30.0, 1/02/2017 Heat : 35.0, 3/02/2017
================fahrenheit========================== Heat : 158.0, 1/02/2017 Heat : 86.0, 1/02/2017 Heat : 95.0, 3/02/2017
================celsius============================ Heat : 158.0, 1/02/2017 Heat : 86.0, 1/02/2017 Heat : 95.0, 3/02/2017
Так же имеется другой вопрос относительно этой же программы. найти максимальное значение в ArrayList


Ответ

Метод clone определен в ArrayList как копирование ссылок элементов.
public Object clone() { try { ArrayList v = (ArrayList) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(e); } }
Таким образом, элементы равны с точностью до ссылки celsius.get(i) == fareng.get(i) для любого i, и при изменении элемента в одном списке вы измените его же в другом списке.
Для решения вашего вопроса нужно воспользоваться глубоким копированием, то есть сделать дополнительно и копии самих элементов.
for (HeatSensor h : celsius) { fareng.add(h.clone()); }
P.S. в разработке не рекомендуется использовать метод clone. Он считается плохим дизайном в приложении. Вам стоит воспользоваться копированием через конструктор.
List fareng = new ArrayList<>(celsius.size()); for (HeatSensor h : celsius) { fareng.add(new HeatSensor(h)); }
И сам конструктор:
public HeatSensor(HeatSensor another) { this.celsius = another.celsius; // и так далее по аналогии }

Разница get; set;

Не совсем понял разницу между
public object Variable1 {get; set; }
и
public object Variable1 { get { return this.Variable1; } set {this.Variable1 = value; } }
В обоих случаях это свойство. Отличается ли не обработанные геттер и сеттер от обработанных таким образом?


Ответ

В том виде, который привели вы, разница в том, что первый пример кода корректный, а второй - нет :) У вас во втором случае чтение свойства возвращает это же свойство, что приводит к возврату этого же свойства - и так до бесконечности. Как заметили в комментариях, это бесконечная рекурсия. Вероятно, вы имели в виду вот это:
private object field1; public object Variable1 { get { return field1; } set { field1 = value; } }
Вот в этом случае разницы нет, public object Variable1 {get; set; } - это автоматически реализуемое свойство, по смыслу - абсолютно тоже самое.

Приведение к одной высоте блоков с разным количеством текста

Доброго времени суток. Есть вот это:
#wrapper { border: 1px solid black; margin: auto; width: 70%; text-align: center; } .block { margin: 10px; text-align: center; width: 140px; display: inline-block; border: 1px solid black; } .block img { width: 140px; }

Какой-то очень очень очень очень очень очень очень очень длинный текст

Какой-то очень очень очень очень очень

акой-то очень очень очень очень очень очень оч

ой-то очень очень очен

акой-то очень очень очень очень очень очень очакой-то очень очень очень очень очень очень оч

очень очень очен очень очень очен


В каждом блоке есть картинка и текст под ней. Однако в каждом блоке текст может быть разной длины (в разумных пределах, разумеется). Тем не менее получается, что картинки пляшут (смотри пример выше). Ах да, стоит ещё отметить, что количество таких блоков в ряд зависит от ширины экрана.
Было бы замечательно, если бы высота блоков автоматически регулировалась и имела везде одну высоту.
Ввиду недостаточного опыта я представляю себе только два варианта: сделать все блоки какой-то одной максимальной ширины (но этот вариант мне не сильно нравится, т.к. может статься так, что все блоки будут иметь мало текста) или применить js, который перебирает все h4, находит максимальную высоту h4 и применяет её ко всем h4 (смотри ниже)
max = null; jQuery(".block h4").each(function(i) { v = $(this).height(); if (max < v) { max = v; } }); jQuery(".block h4").css('height', max + 'px');
Может есть какой-то другой вариант о котором не подозреваю?


Ответ

#wrapper{ display: flex; flex-flow: row wrap; justify-content: space-around; } .block{ width: 200px; flex-flow: row wrap; border: 1px solid #888; } .block img { width: 140px; height: 140px; }

Какой-то очень очень очень очень очень очень очень очень длинный текст

Какой-то очень очень очень очень очень

акой-то очень очень очень очень очень очень оч

ой-то очень очень очен

акой-то очень очень очень очень очень очень очакой-то очень очень очень очень очень очень оч

очень очень очен очень очень очен