Страницы

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

воскресенье, 26 мая 2019 г.

Отсутствует таблица в SQLite

android.database.sqlite.SQLiteException: no such table: RESUME (code 1): , while compiling: SELECT DISTINCT * FROM RESUME
Потому что в предыдущей версии этой таблицы "RESUME" не было. Щас добавил и запустил и получил эту ошибку.
Как исправить эту ошибку (кроме удаления приложения и заново запустить или очистки кэша)?


Ответ

Почему никто не читает документацию? Создайте дополнительную таблицу в методе SQLiteOpenHelper.onUpgrade()
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("create table resume ..."); } }

Неправильно показывает текущий месяц

Здраствуйте!Мне нужно получить текущую дату и время.Все отображается корректно ,кроме месяца:показывает 11-й месяц.
java.util.Calendar c = java.util.Calendar.getInstance(); String sDate = c.get(Calendar.YEAR) + "." + c.get(Calendar.MONTH) + "." + c.get(Calendar.DAY_OF_MONTH) + " в " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE); tv.setText(sDate);


Ответ

Потому что, январь начинается с 0, соответственно декабрь - 11-й месяц. Если хотите получить именно 12 вместо 11, то можно написать так)
c.get(Calendar.MONTH)+1;
Вот еще вариант, только вместо 12 возвращает сокращенный вариант месяца "дек",
SimpleDateFormat sdfMM = new SimpleDateFormat("MMM"); sdfMM.format(c.get(Calendar.MONTH);
И чтобы получить "декабрь"
SimpleDateFormat sdfMMM = new SimpleDateFormat("MMMM"); sdfMMM.format(c.get(Calendar.MONTH);

Доступ к private членам шаблонного класса

template class A { int x;
public: void foo() { A<1> a; //a.x; // Как получить прямой доступ к x для инстанциаций A, i != 1? } };


Ответ

Так сойдет?
template class A { int x;
template friend class A;
public: void foo() { A<5> a5; cout << a5.x; A<2> a2; cout << a2.x; } };

int main(int argc, const char * argv[]) { A<8> x; x.foo(); }

Push. Внутренние папки в репозитории

Запушил на bitbucket свой локальный репозиторий, но папка(не пустая), которая была в нем не добавилась. Как ее запушить? Использую программу Git GUI


Ответ

Git не версионирует папки сами по себе, только файлы. Чтобы добавилась папка, нужно добавить хотя бы один файл из неё.
# Можно добавить всё содержимое папки git add foo # но достаточно хотя бы одного файла git add foo/file.txt git commit -m'message' # теперь папка добавлена
Если файлов в папке нет, то есть общепринятая практика — создать файл с именем .gitkeep (точка в начале важна).
# создаём пустой файл любым способом, например через touch touch foo/.gitkeep git add foo/.gitkeep git commit -m'message'

Если вы проделали вышеуказанные инструкции, но не видите папку при просмотре файлов на Bitbucket (или GitHub, GitLab и т.п.), проверьте выбранную в данный момент ветку. Все эти сервисы по умолчанию показывают состояние из ветки master. Если ваша папка была добавлена в другой ветке, нужно переключиться на просмотр этой ветки.

Проверка принадлежности числа множеству

Есть ли специальные операторы в c# для определения принадлежности числа множеству? Аналог в паскале: 2 in [1..4], возвращает true в данном случае.


Ответ

Как вариант, можно написать метод или даже метод-расширение:
public static class RangeHelper { public static bool IsInRange(this int x, int start, int end) => x >= start && x <= end; }
Использовать так:
if (2.IsInRange(1, 4)) { ... }

Раздать интернет в локальную сеть

У меня есть домашняя сеть на два компьютера. Первый (c linux mint 17.2 64 bit) - это тот, который подключен к интернету через кабель, и от него же идет кабель ко второму (с windows).
Сетевые карточки определились, интернет есть и сеть тоже есть, но я не могу раздать интернет. На компьютере с windows написано "без доступа к Интернету", хотя на линуксовом пишет, что подключение есть.
Как мне раздать интернет на оба компьютера?


Ответ

копия моего ответа на идентичный по сути, но иной по форме вопрос:

если на компьютерах в подсети шлюзом по умолчанию указано использование того самого сервера, который вы настраиваете, то достаточно:
разрешить на этом сервере передачу пакетов между интерфейсами:
$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
для того, чтобы эта настройка применялась и после перезагрузки, раскомментируйте (или добавьте, если нет) строку в /etc/sysctl.conf
net.ipv4.ip_forward=1 проконтролировать, что эти пакеты не искажаются и не блокируются netfilter-ом (см. вывод $ sudo iptables-save). добавить правило netfiler-а для подмены адреса отправителя у пакетов, поступивших с «внутреннего» интерфейса, и уходящих на внешний интерфейс:
$ sudo iptables -t nat -A POSTROUTING -o внешний_интерфейс -j MASQUERADE
если же на этих компьютерах шлюзом по умолчанию служит другая машина (или вообще таковой не задан), то, в дополнение к разрешению передачи пакетов между интерфейсами, вам ещё придётся эти пакеты «искажать».
как минимум потребуется подмена адреса источника у пакетов, поступивших на «внешний» интерфейс, и адресованных компьютерам подсети, а также обратная подмена адреса назначения у «ответных» пакетов.
оба данных действия может выполнять директива netfilter-а под названием snat (source nat). пример её добавления с помощью программы iptables
$ sudo iptables -t nat -A POSTROUTING -o внутренний_интерфейс -j SNAT --to-source ip-адрес
где ip-адрес — адрес, закреплённый за «внутренним» интерфейсом.

для того, чтобы не вводить упомянутые выше одну или две команды (iptables ...) после каждой перезагрузки настраиваемого сервера, их можно добавить, например, в конец файла /etc/rc.local, но до строки exit 0, которая там обычно присутствует (если нет — просто добавляйте в конец файла). добавка sudo, конечно, в этом файле не нужна.

Entity Framework. Несколько связей многие ко многим между двумя таблицами

Используется Code First.
Есть модели Productи User. Пользователь может иметь много продуктов купленных онлайн и много купленных оффлайн. В то же время у продукта есть список пользователей, которые приобрели онлайн и список оффлайн соответственно.
Получается мы имеем 2 связи многие ко многим. Как реализовать это в классах моделей?
public class Product { public int Id { get; set; } public int Price { get; set; }
public virtual ICollection OnlineCustomers { get; set; } public virtual ICollection OfflineCustomers { get; set; } }
public class User { public int Id { get; set; } public string Name { get; set; }
public virtual ICollection OnlinePurchases { get; set; } public virtual ICollection OfflinePurchases { get; set; } }
Насколько знаю, при связи многие ко многим EF автоматически создает третью таблицу, именуя ее ProductUsers. Но если связи две, как будут именоваться дополнительные таблицы? И как можно изменить правило именования промежуточных таблиц, каким атрибутом или Fluent API?


Ответ

Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasMany(q => q.OnlineCustomers) .WithMany(q => q.OnlinePurchases) .Map(q => { q.ToTable("OnlineProductUsers"); q.MapLeftKey("ProductId"); q.MapRightKey("UserId"); });
modelBuilder.Entity() .HasMany(q => q.OfflineCustomers) .WithMany(q => q.OfflinePurchases) .Map(q => { q.ToTable("OfflineProductUsers"); q.MapLeftKey("ProductId"); q.MapRightKey("UserId"); }); }
Всего будет 4 таблицы: Product, User, OnlineProductUsers, OfflineProductUsers
Data Annotations
public class Product { public int Id { get; set; } public int Price { get; set; }
[InverseProperty("OnlinePurchases")] public virtual ICollection OnlineCustomers { get; set; } [InverseProperty("OfflinePurchases")] public virtual ICollection OfflineCustomers { get; set; } }
public class User { public int Id { get; set; } public string Name { get; set; }
public virtual ICollection OnlinePurchases { get; set; } public virtual ICollection OfflinePurchases { get; set; } }
Недостаток в том, что EF сам придумает названия новым таблицам
Всего будет 4 таблицы: Product, User, ProductUsers, ProductUser1

большой образ Docker

При создании Docker образа приходится тянуть 8GB пакетов с хост системы.
Методом COPY, потом удалять. Но вывод docker images показывает размер контейнера с учетом скопированных в слое ранее пакетов. И при каждом следующем релизе образ растет все больше.
Какой механизм можно использовать для доставки пакетов на время генерации образа?


Ответ

Самый оптимальный вариант, использовать статик сервер. И Wgetom тянуть установочные пакеты.

Android, Firebase сервис push уведомлений

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

В данном классе MessagingService реализован сервис, который должен получение слушать сообщения. Вот его код
public class MessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) {
sendNotification(remoteMessage.getNotification().getBody());
} private void sendNotification(String messageBody) { Intent intent = new Intent(this, StereoIntroActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); // Adds the back stack for the Intent (but not the Intent itself) stackBuilder.addParentStack(StereoActivity.class); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(intent); PendingIntent contentIntent = stackBuilder .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher)) .setContentTitle("asasasasas!!!!") //this.getString(R.string.app_name) .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
} }
Мне нужно чтобы открывалось StereoIntroActivity, но почему-то открывается главное активити, мне вообще кажется что этот сервис просто не работает. Подскажите, пожалуйста, в чём у меня проблема. Заранее большое спасибо!
update. вот так отправляю сообщение


Ответ

Есть 2 разных способа отправить сообщение с помощью FireBase. Первый способ - отправить информацию в теле пуша в поле notification - так инфа будет обработана FireBase-ом мочла, без вызова метода onReceive. JSON должен выглядеть так:
{ "notification": { "title": "news", "text": "newsTExt", "click_action": "test" }, "data": { "keyname": "any value" }, "to" : "dAQilNw:APA91IFd666h7WVSlAOyS-WraSrGv_IRZM" }
Так отобразится уведомление, которое направит юзера в активити с intentFilter test, как это указано в поле click_action. Если не будет в манифесте активити с таким фильтром - запустится главная актвити.


Второй способ - отправлять информацию в поле data без поля notification - так точно будет вызван метод onReceive в котором вы можете уже отреагировать на пуш нужным образом, самостоятельно отобразив уведомление. В т.ч. составить PendingIntent для запуска нужной активити.

Через саму консоль FireBase отпрвлять пуши не очень, т.к. там мало что понятно и мало контроля. Лучше отправлять запрос через программу Postman - она есть в т.ч. в виде приложения для браузера Хром.
Для этого надо через Postman отправить POST запрос на адрес https://fcm.googleapis.com/fcm/send При этом надо задать заголовки

Authorization = key=%тут ключ который можно взять из консоли (Настройки-настройки проекта-CLOUD MESSAGING-ключ сервера)% ContentType = application/json
Далее в теле (body) запроса, в raw формате отправлять json с данными, в виде, описанном выше.

Как оптимизировать данный код

Здравствуйте, Есть 2 блока, хочется чтоб .workDataHeight блок брал высоту .work-block. Написал следующее, подскажите пожалуйста как оптимизировать(ведь делается одно и тоже):
var workDataHeightRel = $('.workDataHeight').attr('rel'); var workBlockRel = $('.work-block').attr('rel');
if (workBlockRel = 1) { $('.workDataHeight[rel="1"]').height($('.work-block[rel="1"]').height()); } if(workBlockRel = 2) { $('.workDataHeight[rel="2"]').height($('.work-block[rel="2"]').height()); } if(workBlockRel = 3) { $('.workDataHeight[rel="3"]').height($('.work-block[rel="3"]').height()); } if(workBlockRel = 4) { $('.workDataHeight[rel="4"]').height($('.work-block[rel="4"]').height()); } if(workBlockRel = 5) { $('.workDataHeight[rel="5"]').height($('.work-block[rel="5"]').height()); } if(workBlockRel = 6) { $('.workDataHeight[rel="6"]').height($('.work-block[rel="6"]').height()); }
Так только первый блок отрабатывает:
$(".workDataHeight[rel ="+ workDataHeightRel +"]").height($(".work-block[rel ="+ workBlockRel +"]").height());
Вот весь пример с html, css и js:
var workDataHeightRel = $('.workDataHeight').attr('rel'); var workBlockRel = $('.work-block').attr('rel'); if (workBlockRel = 1) { $('.workDataHeight[rel="1"]').height($('.work-block[rel="1"]').height()); } if(workBlockRel = 2) { $('.workDataHeight[rel="2"]').height($('.work-block[rel="2"]').height()); } if(workBlockRel = 3) { $('.workDataHeight[rel="3"]').height($('.work-block[rel="3"]').height()); } if(workBlockRel = 4) { $('.workDataHeight[rel="4"]').height($('.work-block[rel="4"]').height()); } if(workBlockRel = 5) { $('.workDataHeight[rel="5"]').height($('.work-block[rel="5"]').height()); } if(workBlockRel = 6) { $('.workDataHeight[rel="6"]').height($('.work-block[rel="6"]').height()); } #work{padding:50px;background-color:#eee}#work .work-block{margin-bottom:60px}#work .work-block:last-child{margin-bottom:0px}#work .work-block .workDataHeight{padding:0px !important}#work .work-block .work-data{height:100%;color:#34495e;position:relative}#work .work-block .work-data::before{content:" ";position:absolute;top:46px;left:50%;bottom:46px;width:1px;margin-left:-1.5px;background-color:#34495e}#work .work-block .work-data p{margin:0px;font-family:"RobotoBold",sans-serif}#work .work-block .work-data .data-top{position:absolute;top:20px;width:100%}#work .work-block .work-data .data-bottom{position:absolute;bottom:20px;width:100%}#work .work-block .work-text{height:100%;padding:20px 20px}#work .work-block .work-text h4{font-family:"RobotoBold",sans-serif}#work .work-block .work-text a{color:#f15324}#work .work-block .work-text p{margin:10px 0 0 0}#work .work-block-inverse .work-text{text-align:right}#brand{height:200px !important}

text

text

text

text

text

text

text

texttexttexttexttexttexttexttexttex
ttexttexttexttexttexttexttexttexttexttexttextt
xttexttexttexttexttexttexttexttexttexttexttexttexttext
xttexttexttexttexttexttexttexttexttexttexttexttexttext

text

text

text

text

text

text

text

text

text

text

text

text

text

text

text

text

text

text

text

texttexttexttexttexttexttexttexttex
ttexttexttexttexttexttexttexttexttexttexttextt
xttexttexttexttexttexttexttexttexttexttexttexttexttext

text

text


или jsfiddle


Ответ

Достаточно одной таблэтки строчки в цикле
$('.workDataHeight').each(function(){ $(this).height($(this).closest('.work-block').height()); });
closest - Ближайший подходящий предок. Т.е. Для каждого из выбранных элементов, closest() будет искать ближайший подходящий элемент из числа следующих: сам выбранный элемент, его родитель, его прародитель, и так далее, до начало дерева DOM.

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


Oт верхнего левого квадрата проложите такой путь к нижнему правому квадрата, чтобы сумма чисел, записанных в промежуточных квадратах, а также в стартовом и финишном, составляла 110 (Искомый маршрут может пересекать только стороны, но не вершины промежуточных квадратов и проходить через каждый промежуточный квадрат только один раз).
int mass[7][7] = {{3,4,5,4,3,9,7}, {1,0,6,0,5,0,8}, {2,3,7,6,9,4,1}, {7,0,8,0,1,0,3}, {5,5,9,8,7,2,6}, {1,0,4,0,6,0,3}, {3,4,2,5,5,4,3}};
int a = -1, b = -1, K, M[15];
Search(0, 0, 0, M);
void Search(int I, int J, int S, int M[15]) { if(mass[I][J] == 0 && b == J) { //если элемент черный J--; I++; }
if(mass[I][J] == 0 && a == I) { I--; J++; }
M[I + J] = mass[I][J]; // запись пути a = I; b = J;
if ((I == 6 && J == 6) && (S + mass[I][J] == 110)) { //условие выхода K++; Rez(M);//вывод пути printf(" = %3d ", S + mass[I][J]); //сумма чисел return; }
if (I < 6) { Search(I+1, J, S+mass[I][J], M); }
if (J < 6) { Search(I, J+1, S + mass[I][J], M); } }
Проблема состоит в том что я не могу понять как и куда возвращаться, если сумма в конце пути или раньше неверна. Как понять, после какого элемента был выбран неверный путь.


Ответ

Вот, поразвлекался... http://ideone.com/DSMlQs Такой себе рекурсивный поиск с отсечениями.
#include #include
using namespace std;
const int Tgt = 110; const int I = Tgt;
int m[7][7]={ {3,4,5,4,3,9,7}, {1,I,6,I,5,I,8}, {2,3,7,6,9,4,1}, {7,I,8,I,1,I,3}, {5,5,9,8,7,2,6}, {1,I,4,I,6,I,3}, {3,4,2,5,5,4,3} };
bool path[7][7] = { false };
bool step(int x, int y, int sum) { sum += m[x][y]; if (sum > Tgt) return false; if (x == 6 && y == 6) { if (sum != Tgt) return false; path[x][y] = true; for(int i = 0; i < 7; ++i) { for(int j = 0; j < 7; ++j) { cout << (path[i][j] ? '*' : ' '); } cout << endl; } return true; }
path[x][y] = true;
// Up if (y > 0 && !path[x][y-1]) { if (step(x,y-1,sum)) return true; } // Dn if (y < 6 && !path[x][y+1]) { if (step(x,y+1,sum)) return true; } // Lt if (x > 0 && !path[x-1][y]) { if (step(x-1,y,sum)) return true; } // Rt if (x < 6 && !path[x+1][y]) { if (step(x+1,y,sum)) return true; } path[x][y] = false; return false; }
int main(int argc, const char * argv[]) { step(0,0,0); }

Почему при дробных значениях алгоритм не работает?

Задача следующая:
Ввести целое число a и вывести сумму квадратов всех чисел от 1 до a с шагом 0.1. (1^2+1.1^2+1.2^2+...+a^2)
Алгоритм решения такой:
result := 0 while (a >= 1) do begin result := result + a * a; a := a - 0.1; end;
В конце работы программы результат должен быть:
При a = 1.1 result = 2.21 При a = 3 result = 91.7
Переменная a, в любом случае, при завершении программы должна быть равна 0.9
Проблема в следующем. При a = 1.1 все верно, но начиная с 1.2 и далее программа выдает в результате на 1 меньше, чем нужно: a = 3; result = 90.7, при этом, в конце выполнения программы, a = 0.9(9)
Если модифицировать алгоритм: переменную a после ввода умножать на 10, а затем в цикле в квадрат возводить не ее, а выражение a / 10, то все начинает работать правильно (второй строкой в цикле здесь будет: a := a - 1).
В чем может быть проблема?


Ответ

Проблема в том, что числа представлены в двоичном виде. Десятичное значение 0,1 не может быть представлено в двоичном виде конечной дробью, оно равно 0,0001100110011...2 или 0,0(0011)2 в стандартной записи рациональных дробей.
У чисел с плавающей точкой с двойной точностью хранится 53 двоичных знака после запятой, бесконечная часть дроби отбрасывается. В результате вместо точного значения 0,1 мы имеем число 0,1000000000000000055511151231257827021181583404541015625. Если вы выведете его на печать с не очень большой точностью, вы получите 0,1, но это только результат округления. При округлении до 17-го знака получается 0,100000000000000001, и последний знак участвует в вычислениях. Поэтому, два раза вычитая из 1,2 значение 0,1, вы получаете число меньшее 1.
Простого решения подобных проблем на все случаи жизни не существует. Простейшим в вашем случае будет эмуляция чисел с фиксированной запятой, например так, как вы и сделали.
Можно упростить вычисления, посчитав суммы квадратов целых чисел, и разделив результат на 100:
a2 + (a + 0.1)2 + (a + 0.2)2 + ... =
(10a)2/100 + (10a + 1)2/100 + (10a + 2)2/100 + ...
Можно использовать библиотеки, которые обеспечивают работу с рациональными числами, с числами в десятичной системе счисления (как тип decimal в C#), или с числами большой точности.

Как сделать UPDATE, а при отсутствии записи - INSERT?

Цель такая: если запись с таким id есть, тогда делаем инкремент значения в столбце count этой строки, а если же нет, то создаём новую запись (у столбца count задан DEFAULT 0). База данных - MySQL.
Конечно, можно сделать несколько проверок и реализовать такую логику через условия в самом языке программирования, но можно ли осуществить всё это одним SQL запросом (чтобы работало быстро), или, по крайней мере, сделать как-то изящнее?


Ответ

INSERT INTO `table` (`id`) VALUES (123456) ON DUPLICATE KEY UPDATE `count`=`count`+1;

От чего зависит плавность сайтов?

От чего зависит плавность сайтов? Имею в виду разные эфекты появления меню, слайдеры, скроллы и тп. Сделал меню, на пк проверяю все нормально, плавно, красиво. Но, когда дело доходит до проверки на моб. устройствах мне становится стыдно. Все рывками, дергается, непонятно как смещается и тп. Даже обычный скролл тупит.
Подскажите, как правильно делать плавную верстку, от чего это зависит(css свойства и тп), какие есть подводные камни?
P.S. Пример моего меню
$('.trigger-menu').on('click', function () { $('body').toggleClass('menu-open'); }); $('.bg').on('click', function () { $("#mobile-menu-trigger:checked,.menu-inner-trigger:checked").prop("checked", false).change(); $('body').toggleClass('menu-open'); }); ul, li { list-style: none; margin: 0; padding: 0; } .container { width: 500px; height: auto; margin: auto; padding: 15px; overflow: hidden; border: 1px solid lightgrey; position: relative; height: 300px; } .mobile-menu { width: 80%; max-width: 300px; position: absolute; top: 0; right: auto; bottom: 0; transition: -webkit-transform .4s ease; transition: transform .4s ease; transition: transform .4s ease, -webkit-transform .4s ease; -webkit-transform: translate3d(-102%, 0, 0); transform: translate3d(-102%, 0, 0); left: 0; z-index: 5; box-shadow: 3px 0 4px lightgrey; } .mobile-menu__header { width: 100%; padding: 10px 0; border-bottom: 1px solid #ff4081; background: #fff; } .mobile-menu__logo-wrapper { width: 150px; margin: 0 auto; } .mobile-menu__list { width: 100%; height: 100%; } .mobile-menu__item { border-bottom: 1px solid lightgrey; } .mobile-menu__link { padding: 5px; display: block; } .mobile-menu__inner { background: #f78a8a; width: 100%; position: absolute; top: 0; left: 0; right: auto; bottom: 0; transition: -webkit-transform .4s ease; transition: transform .4s ease; transition: transform .4s ease, -webkit-transform .4s ease; -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); } #mobile-menu-trigger:checked + .mobile-menu { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } input[data-menu="menu"]:checked + .mobile-menu__inner { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } .display-hidden { display: none; } .trigger-menu { background: #91a2f7; float: right; } .bg { position: absolute; top: 0; right: 0; bottom: 0; left: 0; background: rgba(255, 255, 255, 0.8); z-index: 1; visibility: hidden; opacity: 0; transition: all 0.3s; } .menu-open .bg { opacity: 1; visibility: visible; } .logo { width: 100%; height: auto; } .menu-back-trigger { border-bottom: 1px solid #ff4081; }



Ответ

В этой очень легкой задачке, как выдвижное меню, слишком сложная реализация. Ты просто перегружаешь браузер ненужной работой, ни тебе, ни ему. Зачем translate3d, если идет работа с чистейшим 2Д? Я бегло посмотрел, но вероятно, вложенность тегов не учитывает слои для прорисовки браузером, а они, в свою очередь, плохо заданы css свойствами. Я советую покапать в сети о том, как браузер прорисовывает анимацию, что лучше использовать transition или animation и в каких случаях. Даже если эффект достигается один и тот же, зачастую два разных свойства оказывают неравный след на производительности. У меня есть такой пример: я пытался сделать тень на градиентном элементе. Дело в том, что text-shadow рисуется поверх градиента (background-color: linear-gradient). И это можно обойти двумя путями, в основном теге отрисовывать тень с помощью text-shadow, а в псевдоклассе рисовать градиентный текст. Этот вариант я и выбрал, сейчас расскажу почему. Либо же использовать filter: drop-shadow. И тут уже встает логический вопрос, по простой внутренней логике понятно, ведь чтобы нарисовать простенькую тень, не хотелось бы использовать фильтр. Почему? Если при этом ещё использовать transform: scale, то браузер каждый кадр этого скейла будет отрисовывать новый фильтр. А это затратно и на самом деле на моем стационарном компе, в Хроме, начинало подлагивать такое появление, хотя анимация шла 80ms, то есть быстрее чем среднее моргание человека. Так что вывод такой: нужно отрисовывать в голове и понимать, как рисует это всё браузер, не использовать навороченные свойства в сторону их силы, а посмотреть на простенькие, но эффективные в связке css-свойства.

DOMImplementation - проверка версии DOM

Хотел посмотреть, какой результат получу при запуске следующего интерфейса DOM 3
alert(DOMImplementation.hasFeature("Core", "3.0"));
Однако ни при использовании Microsoft Edge, ни при использовании Google Chrome никакой реакции не получил.
Поддерживается ли этот интерфейс DOM 3 браузерами, или я что-то делаю не правильно?


Ответ

DOMImplementation - это один из предоставляемых браузером интерфейсов, поэтому для вызова функций описываемых в этом интерфейсе необходим объект, который этот интерфейс реализует.
Такой объект определен в интерфейсе Document
interface Document : Node { [SameObject] readonly attribute DOMImplementation implementation; ... }
Поэтому вызов должен выглядеть так:
alert(document.implementation.hasFeature("Core", "3.0"));
Но если обратиться к описанию этого метода
The hasFeature() method must return true. Note: hasFeature() originally would report whether the user agent claimed to support a given DOM feature, but experience proved it was not nearly as reliable or granular as simply checking whether the desired objects, attributes, or methods existed. As such, it should no longer be used, but continues to exist (and simply returns true) so that old pages don't stop working.

Как упростить два обработчика события?

Мой код работает. Но думаю, что как-то не так написал. Можно ли такое сократить?
$( "#clickbtn_recovery" ).click(function() { $( ".modal-backdrop.in" ).hide( 500 ); }); $( "#clickbtn_recovery" ).click(function() { $( "#exampleModal_auth" ).hide( 500 ); });

кнопка нажать

HTML-код модального окна под спойлером ниже.


Ответ

Селекторы можно перечислять через запятую:
$( "#clickbtn_recovery" ).click(function() { $( ".modal-backdrop.in, #exampleModal_auth" ).hide( 500 ); });

Есть ли встроенные процедуры сортировок в Delphi?

Нужно сделать прогу, которая бы сортировала список по определённому полю. Но писать самому сортировку лень. Есть ли встроенные процедуры в Delphi?


Ответ

В Delphi есть TList который может хранить произвольные типы данных и позволяет их сортировать. Метод TList.Sort(), в качестве аргумента принимает вашу функцию сортировки. Сортировка списка проводится внутри TList (используется QuickSort), но каждая пара элементов сравнивается, вызывая функцию, которую вы указали для этого метода.
Минимальный пример, который показывает как можно отсортировать список по тому или иному полю, просто подставив нужную функцию сортировки:
uses Classes, SysUtils;
type TListItem = record F1: string; F2: Integer; end; PListItem = ^TListItem;
function CompareByF1(Item1, Item2: Pointer): Integer; begin Result := CompareText(PListItem(Item1).F1, PListItem(Item2).F1); end;
function CompareByF2(Item1, Item2: Pointer): Integer; begin Result := PListItem(Item1).F2 - PListItem(Item2).F2; end;
procedure Test; var I: Integer; VList: TList; VTestItem: PListItem; begin VList := TList.Create; try try // заполнение списка данными for I := 9 downto 0 do begin New(VTestItem); // динамическое выделение памяти для элемента списка VTestItem.F1 := 'TestStr#' + IntToStr(I); VTestItem.F2 := I; VList.Add(VTestItem); end;
// тестовая перчать списка ДО сортировки for I := 0 to VList.Count - 1 do begin Writeln(PListItem(VList.Items[I]).F1); end; Writeln;
VList.Sort(CompareByF2); // сортировка по нужному нам полю
// тестовая перчать списка ПОСЛЕ сортировки for I := 0 to VList.Count - 1 do begin Writeln(PListItem(VList.Items[I]).F1); end; finally for I := 0 to VList.Count - 1 do begin Dispose(VList.Items[I]); // освобождение ранее выделенной памяти end; end; finally VList.Free; end; end;
А вот тут: How do I sort a generic list using a custom comparer? есть пример, как сортировать список, в версиях Delphi с поддержкой дженериков.

Что включать в Docker-образ

Имеется веб-сайт на Django, на боевом сервере для запуска использую связку uWSGI/Nginx, локальная разработка - virtualenv/dev-сервер Django
Из некоторых вопросов, которые задал на SO:
Распространение Docker-образов Запуск Docker-образов на боевом сервере Запуск сайта из Docker-образа VS запуск c традиционными средствами (uWSGI, Nginx, Apache)
появилось еще пара.
Что включать в образ Docker?
Мы имеем production-версию и developer-версию. Как понимаю, в репозиториях распространяют production.
Имеет ли смысл создавать docker-образ для developer-версии (применительно ко мне, код проекта и виртуальное окружение virtualenv)? Или разработчику достаточно только кода из репозитория, чтобы начать разработку?
Где создают docker-образ production-версии?
На боевом сервере имеется проект, который работает на указанной связке - uwsgi/nginx/упаковщик с production-настройками. Собирать образ я должен на боевом сервере?


Ответ

Не должно быть понятия production и non-production версия образа. Разработчики, тестировщики, эксплуатационники и все остальные должны использовать одну и туже версию образа.
Процесс разработки может быть устроен совершенно по разному, но если используется docker-образ (например, сервер разрабатываемый другой группой) в качестве внешней зависимости, то он должен браться из того же источника, что и для других нужд - тестирование, эксплуатация и т.п.
Как, где и чем создают docker-образы?
Процесс изготовления образа должен быть полностью автоматизирован, что бы избежать ошибок и сделать процесс повторяемым.
Приблизительно процесс изготовления образа выглядит так (я опускаю некоторые шаги):
Разработчик дописал код и протестировал его локально, в том числе и сборку образа. Разработчик заливает код в систему контроля версий. Робот собирает проект и создает артефакты для развертывания (мнифицирует все, объединяет в общий пакет и т.п.).
Необязательный шаг - артефакты помещаются в хранилище. Робот собирает docker-образ.
Необязательный шаг - робот подписывает образ. Робот заливает образ в реестр.
Если нет специфических требовани, то для управления процессом создания можно использовать любой Continuous Integration сервер - Jenkins, TeamCity, Bamboo и т.д. У них у всех есть соответсвующие плагины или можно написать простые шел-скрипты и создавать образы стандартной командой docker build
Что включать в docker-образ?
Сложно дать однозначный ответ на этот вопрос, так как многое зависит от типа образа и личных предпочтений. Я напишу как бы я поступил с сервером на Django
Я мало работал с Django, так что поправьте меня, если я говорю что-то несоответствующее действительности.
Если проект только начинается и нагрузка на сервис будет маленькая, то я бы поместил все (кроме БД) в один образ. Т.е. образ будет содержать:
Python фиксированной версии установленный как системный (без virtualenv и пр) nginx/Apache фиксированных версий с нужными настройками собственно ваше приложение, взятое как артефакт для развертывания и развернутое внутри образа
БД либо в отдельный образ, либо на отдельный сервер без использования контейнерезации. Если БД идёт отдельным образом, то важно позаботится о сохранении данных на внешний (по отношению к контейнеру) раздел диска. В противном случае данные будут утеряны при перезапуске контейнера.
Если нагрузка будет значительная и есть много статических страниц, то я бы сделал несколько образов:
Образ со статическими страницами
nginx/Apache статическая часть вашего приложения Образ с динамической частью
Python часть вашего приложения (Django) Образ балансировщиком (необязательный)
nginx/HAProxy/Varnish/etc
Если проект очень большой, то возможно статическую и динамическую часть делают разные команды и в этом случае они и буду отвечать за подготовку Dockerfile к своей части проекта.

Работа в команде c GIT

Идет разработка проекта, добавляются новые люди в команду. Контроль версиями осуществляется с помощью GIT. Разъяснить алгоритм подключения нового человека к работе над проектом. Допустим последний коммит имеет название second.
Создается новая ветка для нового разработчика Он клонирует репозиторий проекта Переходит в свою ветку
Вопрос 1: Я правильно понимаю алгоритм добавления нового разработчика к проекту?
Вопрос 2: После клонирования новый разработчик начинает свою работу, в своей ветке, с коммита second?


Ответ

Не нужно создавать под разработчика специально ветку. Это контрпродуктивно.
Ветки создают разработчики под фичи (задачи/баги). Нормально, когда есть несколько долгоживущих веток (master/develop) и много краткоживущих под задачи.
https://habrahabr.ru/post/106912/ http://danielkummer.github.io/git-flow-cheatsheet/index.ru_RU.html
а также здесь на сайте:)
При работе в команде, как правильно подтягивать изменения из веток в git?

Маcштабирование c# wpf

Доброго времени суток. Разрабатывал приложение на мониторе 4:3 и сейчас купил 16:9. На 4:3 оно почти во весь экран а на 16:9 ничего не видно почти. Как бороться с этим?
Хотелось бы реализовать режим во все окно. Но опять же элементы остаются на местах растягивается только окно. Как увеличить их и оставить в том же месте?
Когда очень много вот кусок, может если его доделать то и все остальное по принципу сделаю

Вопрос по переводу чисел между системами счисления

Почему из десятичной в любую систему (что в двоичную, что в шестнадцатеричную) число переводится методом деления, а из любой в десятичную - другим методом? Чем так обособлена именно десятичная система? Ведь, с точки зрения математики она ничем не должна отличаться от тех же двоичной и шестнадцатеричной кроме алфавита - набора символов. Мне всегда казалось, что из большей в меньшую переводим методом деления, а из меньшей в большую - другим методом.


Ответ

Если я правильно понимаю ваш вопрос, то, скорее всего, у вас когнитивный диссонанс :) из-за того, что вы выполняете перевод из двоичной в десятичную - ну, типа, 110101 = 1 + 4 + 16 + 32 = 53, и забываете о том, что вы уже работаете в десятичной записи. И на этом ваше преобразование завершено.
Давайте иначе - через, ну, скажем, семеричную. Тогда 110101 = 1 + 4 + 22 + 44 = 104
Если бы вы работали в семеричной системе счисления, вы бы это 104 считали ответом и больше ничего не делали. Разве что задали бы здесь вопрос - и чем же семеричная система счисления такая выдающаяся? :)
А теперь нужно 104 перевести в десятичную... Делим 104 на 13 (10 в семеричной), получаем 5, и в остатке 3, итого записываем в десятичной 53...
Это ответ на ваш вопрос?

Добавить имя к IP адресу

При сканирование некоторых IP, заметил, что у некоторых есть «имя». Например, у гугла - 95-30-216-45.broadband.corbina.ru. Что это за «имя» и как этого добиться у себя на сервере?
PING google.com (95.30.216.45) 56(84) bytes of data. 64 bytes from 95-30-216-45.broadband.corbina.ru (95.30.216.45): icmp_seq=1 ttl=5


Ответ

Данное «имя» (являющееся доменным) утилита ping получает отдельным запросом к сервисам Reverse Lookup DNS. Данные сервисы позволяют узнать доменное имя по IP-адресу (если оно существует). Причём это не обязательно имя сайта; DNS позволяет присваивать имена узлам вне зависимости от их назначения.

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

Как корректно вывести дробное число?

Здравствуйте!
Реализую проект на Qt. Пытаюсь вывести дробь, знаменатель которой не является степенью двойки (19 знаков после запятой). Например, 1/5 = 0,2000000000000000111.
Понятно, что такой вид - особенность представления чисел с плавающей точкой в C++. Но как вывести доступный для пользователя результат (1/5 = 0,2)? Формат вывода желательно не менять.
Пользуюсь следующим методом для вывода числа.
QString MainWindow::numberFormat(const double &number) { QString str = QLocale::system().toString(number, 'f', 21); return str.remove(QRegExp(",?0+$")); }
Прошу вашей помощи, заранее благодарю.


Ответ

Я в своё время нашёл только один удобный выход из этой ситуации. Нужно реализовать собственный алгоритм деления числителя на знаменатель "уголком", как в школе, выводя одну десятичную цифру результата за другой. Получив строку нужной длины из цифр после запятой, удаляем нули на конце.
Код такой функции предельно прост (псевдокод, из головы):
void div (unsigned int num, unsigned int denom, size_t n) { printf ("%u,", num/denom); // Целая часть num %= denom; // Дробная часть. while (n-- > 0) { // n - сколько нужно цифр. num *= 10; unsigned int d = num/denom; printf ("%u", d); num -= d*denom; } }
Разумеется, вместо printf вам нужно что-то другое, например, сохранение цифр в строку или что вы там собираетесь делать, я не знаю.

Tkinter, Canvas. Нарисовать спираль

Здравствуйте! Подскажите, пожалуйста, как правильно нарисовать спираль? Написал такую пародию на код
from tkinter import *
root = Tk()
canvas = Canvas(root, width=300, height=300) canvas.pack() step = 10 p = [145, 145, 155, 155] iters = 0 canvas.create_arc(p[0], p[1], p[2], p[3], start=0, extent=180, style=ARC)
while p[0] > 10: if (iters % 2): canvas.create_arc(p[0] - step, p[1] - step, p[2], p[3], start=0, extent=180, style=ARC) p[0], p[1] = p[0] - step, p[1] - step else: canvas.create_arc(p[0], p[1], p[2] + step, p[3] + step, start=0, extent=-180, style=ARC) p[2], p[3] = p[2] + step, p[3] + step iters += 1 root.mainloop()
На выходе получаю такое:

Вопрос в том как избавиться от этой щели?
Я пробовал играться с аргументами start и extent, но какого-либо качественного результата это не дало, потому что две части не совпадали друг с другом, т.е. что-то типо этого:

^ Тут я от балды ввел значения, попиксельно не подгоняя.
Сталкивался ли кто с такой проблемой?


Ответ

На каждом шаге нужно расширять эллипс (частью которого является отрисовываемая дуга) вверх и вниз одинаково. Если делать как у вас сейчас, то центры четных и нечетных эллипсов будут смещаться вверх и вниз от горизонтальной оси, из-за чего и получается зазор между верхней и нижней частью. Рабочий код:
from tkinter import *
root = Tk()
canvas = Canvas(root, width=300, height=300) canvas.pack() step = 10 p = [145, 145, 155, 155] iters = 0 canvas.create_arc(*p, start=0, extent=180, style=ARC)
while p[0] > step: p[1] -= step/2 # расширение вниз p[3] += step/2 # расширение вверх
if iters % 2: p[0] -= step # расширение и сдвиг левой границы влево canvas.create_arc(*p, start=0, extent=180, style=ARC) else: p[2] += step # расширение и сдвиг правой границы вправо canvas.create_arc(*p, start=0, extent=-180, style=ARC)
iters += 1
root.mainloop()

Не видит драйвер QPSQL на другой машине Qt

Собрал релиз версию программы, которая работает с postgresql через qt-шный драйвер. Перенес туда все необходимые dll-ки, перенес папку plugins с драйвером. Экзешник запускается, драйвер видит, все замечательно. Но, когда переношу на другую машину драйвер qpsql не распознается. Я не уверен, но может быть на другую машину тоже нужно ставить клиент postgresql? Подскажите, кто сталкивался с подобной проблемой.
UPD:
В корне у меня находятся постгресовские dll: libeay32.dll libintl.dll libpq.dll ssleay.dll
DependencyWalker просит для самого драйвера:
LIBGCC_S_DW2-1.DLL LIBPQ.DLL LIBSTDC++-6.DLL QT5CORE.DLL QT5SQL.DLL
Но это, вероятно, нормально потому что он находится в \plugins, а то что он просит есть в корне.
dll постгреса просят следующее:
MSVCR120.DLL IESHIMS.DLL
Вероятно, msvcr120 - это и есть vcredist. Но, я поставил vcredistx86 и это не помогло. Компилил mingw32.


Ответ

Нет, клиент PostgreSQL ставить не нужно. Нужны 3 dll-библиотеки из комплекта PostgreSQL: libintl8.dll, libpq.dll, lib(забыл)-2.dll (это приблизительные названия, могу ошибаться, сейчас с собой нет Postgres). Располагаться они должны рядом с основным исполняемым файлом. Кроме того, Postgres скомпилирован в Visual Studio, поэтому вам понадобится установить vcredist. Необходимую версию можно узнать с помощью DependencyWalker. А также соблюдайте разрядность. Она должна быть одинаковая у вашей программы, у vcredist, у библиотек Postgres.
Драйвер базы данных необходимо поместить в папку sqldrivers. Причем, чтобы всё заработало, мне пришлось самому компилировать этот драйвер. Но раз у вас на основной машине всё работает, то, скорее всего, это не понадобится.
Если не найдёте, точные названия могу написать завтра.

UPD. Судя по названию MSVCR120.DLL, требуется vcredist версии 2013. ieshims.dll - это Internet Explorer. Скорее всего, этот файл будет не нужен. Файлы вроде Qt5Core.dll, Qt5Sql и др. должны быть рядом с исполняемым файлом, а файл qsqlpsql.dll должен быть в папке sqldrivers.

UPD. Вот список нужных DLL:
libiconv-2.dll libintl-8.dll libpq.dll

Как усыпить текущий поток с возможностью возобновления из другого потока в Qt?

Имеется поток, который иногда засыпает(QThread::sleep) на довольно продолжительное время (около 5 секунд). Если пользователь закрывает программу, то основной поток пытается завершить уснувший, и ожидает его действительного завершения с помощью функции QThread::wait. Но 5 секунд - достаточно продолжительное время, чтобы пользователь занервничал. В связи с этим вопрос: как разбудить поток, который внутри себя вызвал функцию QThread::sleep?


Ответ

Qt не предоставляет средств для пробуждения спящего потока. Но вместо этого можно использовать класс QWaitCondition с некоторой доработкой. Напишем для этого специальный класс.
WakeableSleep.h:
#ifndef WAKEABLESLEEP_H #define WAKEABLESLEEP_H #include #include #include #include /** * @brief Класс, который позволяет временно усыпить поток с возможностью пробуждения из другого потока. * * Класс можно создать в любом потоке. При вызове метода
ef sleep поток приостанавливается * на время, переданное с параметром. При вызове метода
ef wake из другого потока целевой * поток возобновляет выполнение независимо от истекшего времени. * \threadsafe */ class WakeableSleep : public QObject { Q_OBJECT public: explicit WakeableSleep(QObject *parent = 0); /** * @brief Усыпить текущий поток на milleseconds миллисекунд. * @param milliseconds Время сна. */ void sleep(quint32 milliseconds); /** * @brief wake Пробудить целевой поток из другого потока. */ void wake(); private: QMutex mutex; QWaitCondition waitCondition; }; #endif // WAKEABLESLEEP_H
WakeableSleep.cpp:
#include "wakeablesleep.h" WakeableSleep::WakeableSleep(QObject *parent) : QObject(parent){}
void WakeableSleep::sleep(quint32 milliseconds) { mutex.lock(); waitCondition.wait(&mutex, milliseconds); mutex.unlock(); }
void WakeableSleep::wake() { mutex.lock(); waitCondition.wakeAll(); mutex.unlock(); }
Теперь вместо метода QThread::sleep можно использовать методы этого класса следующим образом:
WakeableSleep sleeper; void Thread1() { sleeper.wake(); } void Thread2() { sleeper.sleep(5000); }

Можно ли обратится к элементу(элементам) через несколько указание нескольких атрибутов?

Возможно ли обратится к элементу(элементам) через указание нескольких атрибутов?
например: [class*="col"][role="main"] или [class*="col", role="main"] или [class*="col" role="main"]
Если возможно, то как корректно?


Ответ

Попробуйте так:

first
second
third


Документация доступна на русском по ссылке
Документация доступна английском по ссылке

Как вернуться в нужную сессию tmux

Допустим у меня есть 3 открытие сессии в системе. Через команду tmux list-sessions я могу увидеть список. Но как вернуться в нужную мне сессию из представленного списка?


Ответ

tmux attach -t 1 - присоединиться к окну "1" (та цифра в квадратных скобках слева).

Правила удержания аннотаций. SOURCE, CLASS, RUNTIME

Что обозначают правила SOURCE, CLASS и RUNTIME, инкапсулированные в перечисление java.lang.annotation.RetentionPolicy?


Ответ

Рассмотрим вопрос на примере аннотации @Override, которая указывает на переопределение метода.
Так выглядит @Override в своей реализации
@Retention(RetentionPolicy.SOURCE) public @interface Override { }
SOURCE в данном случае указывает на то, что аннотация @Override (как и другая, к которой это правило будет применимо) будет "отброшена" во время компиляции. CLASS - как другое правило, указывает, что аннотация, к которой оно будет применимо, сохранится в файле с расширением .class во время компиляции, но не будет доступна для виртуальной машины JVM во время выполнения. RUNTIME - как другое правило, указывает, что аннотация, к которой оно будет применимо, сохранится в файле с расширением .class во время компиляции, и будет доступна для виртуальной машины JVM во время выполнения.

Ввод ФИО в один TextBox, маска

Подскажите пожалуйста, можно ли реализовать, и если да, то как, такую затею. TextBox, в нём маска на ввод трёх слов - ФИО. Пробовал такую маску: "L L L", она конечно не сработала, т.к. даёт ввести по одному символу между пробелами, а нужно неограниченное количество символов. Регулярки использовать здесь не хочу, нужно именно чтобы в текстбоксе были символы нижнего подчёркивания, указывающие место для ввода


Ответ

С помощью маски это не решить. Вам нужно валидировать ввод постфактум. Варианта два:
Валидация символов на этапе ввода. Простой вариант -- реагировать на нажатие клавиши, продвинутый вариант -- валидировать полноценно (WinForms). Аналогичное решение можно соорудить и для WPF. Валидация введенного текста целиком при помощи регулярных выражений.
Если вы хотите проверять русские ФИО, то помните, что кроме букв в них как минимум могут содержаться еще и дефисы. Если хотите проверять также и иностранные имена, написанные кириллицей, то все становится еще сложнее: тут вам и цифры, и апострофы, и запятые, и точки, и черт знает что еще. А если иностранные имена еще и в оригинале, то вообще все плохо :).

Ninject не может создать обьект

При попытке создать обьект через контейнер Ninject вылетает exception : Object reference not set to an instance of an object. Подскажите, пожалуйста, в чем может быть проблема?
Метод с класса NinjectDependencyResolver
private void AddBindings() { var mapperConfiguration = new MapperConfiguration(cfg => { cfg.AddProfile(new TagProfile()); }); var mapper = mapperConfiguration.CreateMapper(); _kernel.Bind().ToSelf().InRequestScope(); _kernel.Bind, Repository>(); _kernel.Bind().ToConstant(mapper);
var repository = _kernel.Get>();// вылетает exception _kernel.Bind(); }
Класс Repository
public class Repository : IRepository where T : class { private readonly BlogDbContext _db;
public Repository(BlogDbContext db) { _db = db; } }
P.S. Не знаю важно ли это, но репозиторий с его интерфейсом находится в одной сборке, а регистрация Ninject в другой.


Ответ

Ошибка говорит о том, что в экземпляре объекта не задана ссылка на объект.
Object reference not set to an instance of an object.
В этих двух строчках
_kernel.Bind, Repository>(); _kernel.Bind();
Вы "говорите" IoC-контейнеру, что при запросе IRepository или Repository, необходимо вернуть реализацию, но не указываете ее.
Правильным будет следующий вызов.
_kernel.Bind>().To>(); _kernel.Bind().To();
Вы сообщаете IoC-контейнеру, что при запросе IRepository создать экземпляр класса Repository. Для второй строки аналогично.
И ответ на вопрос из комментария:
для контекста делаю InRequestScope(), нужно ли мне это делать и для репозитория и для сервиса?
Для репозитория и Сервиса не нужно делать InRequestScope(), только для контекста BlogDbContext

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

Нарисованная фигура не соответствует заданным координатам

В общем, проблема такова, при нажатии на panel создается объект Block и происходит его отрисовка:
private void DrawingPanel_Click(object sender, EventArgs e) { Point ptr = PointToClient(Cursor.Position); ptr.X -= DrawingPanelOffset.X; ptr.Y -= DrawingPanelOffset.Y;
b = new Block(0, "Class", "Model", ptr); DrawingPanel.Invalidate(); }
private void DrawingPanel_Paint(object sender, PaintEventArgs e) { if (b != null) b.Draw(e.Graphics); }
Непосредственно код блока
public void Draw(Graphics g) { Pen BlackPen = new Pen(Color.Black, 4); g.DrawRectangle(BlackPen, Location.X, Location.Y, Location.X + 80, Location.Y + 80); }
В итоге при нажатии на разные места панели получаются разные фигуры

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


Ответ

g.DrawRectangle(..., ..., ..., width, height);
то есть
g.DrawRectangle(BlackPen, Location.X, Location.Y, 80, 80);

Обработка строки даты

Пользователь вводит дату в формате 01/02/17, нужно сохранить дату в трёх переменных int соответственно-daymonthyear. Я разбивал строку с датой на 3 подстроки и переводил в каждую в int. Мне кажется-не самый лучший способ. Есть ли како-то более удачное решение для такой обработки?


Ответ

Можно и удобно регэкспами:
#include #include
std::vector GetDigitDate(const std::string Date) { std::regex Rx("^(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})$"); std::smatch Match; if(!(std::regex_match(Date, Match, Rx) && (Match.size()==4))) throw std::runtime_error(""); return {std::stoi(Match[1]),std::stoi(Match[2]),std::stoi(Match[3])}; }
int main() { try { std::vector T = GetDigitDate("1/07/2011"); for(const auto &i:T) std::cout << i << std::endl; } catch(...) { std::cout << "Что-то не так!" << std::endl; } return 0; }
Естественно, при желании, можно дополнить проверку корректности дней, месяцев и годов. В коде - простейшая проверка просто на числа.
ADD:
Если не нравится возврат вектора, в качестве результата, небольшая модификация кода, но для C++1z
#include #include
std::tuple GetDigitDate(const std::string Date) { std::regex Rx("^(\\d{1,2})/(\\d{1,2})/(\\d{2}|\\d{4})$"); std::smatch Match; if(!(std::regex_match(Date, Match, Rx) && (Match.size()==4))) throw std::runtime_error(""); return {std::stoi(Match[1]),std::stoi(Match[2]),std::stoi(Match[3])}; }
int main() { try { auto [d,m,y] = GetDigitDate("1/07/2011"); std::cout << "d: " << d << " m: " << m << " y: " << y << std::endl; } catch(...) { std::cout << "Что-то не так!" << std::endl; } return 0; }

Структура классов в проекте java

В Desktop Swing приложении есть класс Item в пакете Data, класс ItemFrame (графическое заполнение и редактирование класса Item) в пакете GUI и класс NetWorker в пакете NetDB для работы с DB и сетью. Имена классов и пакетов - условные.
По логике программы, при создании (и редактировании) экземпляра класса Item вызывается графический интерфейс ItemFrame в который заносятся данные, при нажатии кнопки "Сохранить" создается объект Item, который должен быть записан в DB и, при определенных условиях, должны вызываться методы для его передачи по сети и записи в XML.
Получается, что при нажатии кнопки вызывается конструктор Item из другого пакета, и методы по работе с DB и сетью из третьего. Выглядит немного запутанно. Как в таком случае правильно организовать структуру, в каком классе какие методы лучше реализовать?
Интересует именно правильное решение с точки зрения ООП.


Ответ

Вы на верном пути. Разделение пакетов по обязанностям -- это правильно. Тот факт, что при этом будет какое-то место, которые вызывает код из нескольких пакетов -- неизбежен.
Возможно вам стоит придерживаться классической трехслойной архитектуры UI->BLL->DAL (стрелками обозначено направление взаимодействия). Первый и последний слои у вас уже есть, осталось ввести слой бизнес-логики. UI будет передавать ему данные (или уже заполненный Item), BLL будет создавать/брать переданный Item и образаться к NetDB для сохранения.

Регулярное выражение для ФИО

Нужно регулярное выражение где в имени первая буква должна быть большой и другие большие буквы нужно запретить, за исключением случая когда имя пишется через дефис, тогда разрешается большая буква первая и которая идет сразу после дефиса, остальные нельзя. Например
Дмитрий - ОК
ДмИтрий - Ошибка
Дмитрий-Иосиф - ОК
ДмИтрий-Иосиф - Ошибка
Дмитрий-иосиф - Ошибка
Получилась регулярка у меня, только допускающая одну большую вначале, но через дефис имя уже воспринимает неправильно т.к. после дефиса идет еще одна большая.
Мое выражение
@"^[А-ЯЁ][а-яё\-]+\s([А-ЯЁ][а-яё\-]+)(\.|\s)\s*([А-ЯЁ][а-яё\-\.]+)$"
В нем используется шаблон Ф И О


Ответ

Используйте
^\p{Lu}\p{Ll}*(?:-\p{Lu}\p{Ll}*)?$
См. демо регулярного выражения
Подробности:
^ - начало строки \p{Lu} - заглавная буква \p{Ll}* - 0 и более строчных букв (?:-\p{Lu}\p{Ll}*)? - необязательная последовательность следующих шаблонов:
- - дефис \p{Lu} - заглавная буква \p{Ll}* - 0 и более строчных букв $ - конец строки.
Если нужна поддержка только русских букв, замените
\p{Lu} --> [А-ЯЁ] \p{Ll} --> [а-яё]

Работа функции std::time()

Что будет с функцией std::time(0), когда количество секунд, прошедших с 1970 года превысит максимально возможное хранимое число в возвращаемом типе?


Ответ

Циклический перенос :) - уйдет в нуль.
Только ведь теперь time_t - 64-битный, насколько я помню... А за 290 миллиардов лет или C++, или Земля, или человечество - но кто-то точно пропадет...
В Visual C++ 2015
int main(int argc, const char * argv[]) { cout << "sizeof(time_t) = " << sizeof(time_t) << endl; cout << "typeof(time_t) = " << typeid(time_t).name() << endl; }
дает
sizeof(time_t) = 8 typeof(time_t) = __int64

React Native: Android UI component

Нужно подключить компонент:
public class MyComponent extends Activity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.myComponent); ... } ... }
Для него создаю класс Manager
public class MyComponentManager extends SimpleViewManager {
public static final String REACT_CLASS = "MyComponent";
@Override public String getName() { return REACT_CLASS; }
private ThemedReactContext mContext = null; private Activity mActivity = null;
@Override protected MyComponent createViewInstance(ThemedReactContext context) { mContext = context; return new MyComponent(mContext); }
public MyComponentManager(Activity activity) { mActivity = activity; } }
,класс Package
public class MyComponentPackage implements ReactPackage {
private Activity mActivity = null;
public MyComponentPackage(Activity activity) { mActivity = activity; }
@Override public List createNativeModules(ReactApplicationContext reactContext) { return Collections.emptyList(); }
@Override public List> createJSModules() { return Collections.emptyList(); }
@Override public List createViewManagers(ReactApplicationContext reactContext) { return Arrays.asList( new MyComponentManager(mActivity) ); } }
и достаю его в файле myComponent.js
import React from 'react';
import { View, requireNativeComponent } from 'react-native';
export default requireNativeComponent('MyComponent');
Только в MyComponentManager в SimpleViewManager должен подаваться class extends View, а у меня - Activity. Как мне подключить мой компонент?


Ответ

В общем, класс Package всего-то нужно зарегистрировать в файле MainApplication.java:
@Override protected List getPackages() { return Arrays.asList( new MainReactPackage(), new MyComponentPackage() ); }
До этого, конечно, можно и самому додуматься, но тот факт, что официальном мануале ни единого упоминания про это, вводит в заблуждение. Также в myComponent.js нужно указать дефолтные проптайпы:
import React, { PropTypes } from 'react';
import { View, requireNativeComponent } from 'react-native';
let iface = { name: 'MyComponent', propTypes: { ...View.propTypes } };
export default requireNativeComponent('MyComponent', iface);
Наследовать от вью мою активити не нужно, а просто из вью класса её запустить:
Intent newIntent = new Intent(context, MyComponent.class); newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(newIntent);

Медленная работа с БД через PreparedStatement

Как мне в этом коде, сделать так, чтобы я верно использовал PrepareStatement? Я уже всю реализацию ДАО не скидываю, так как очень много кода. В моем коде PrepareStatement замедляет работу, а нужно чтобы ускорял. Я его использую не верно. Я так понимаю, мне его как то открыть надо один раз, потом использовать везде как-то, и потом закрыть? Буду рад любой помощи.
public class MySqlDaoStudent implements DaoStudent { private PreparedStatement stm=null;
private final Connection connection;
private ResultSet rs=null;
public MySqlDaoStudent(Connection connection) { this.connection = connection; }
@Override public Student read(int key) throws SQLException { String sql="SELECT * FROM student_db.student where id = ?;"; Student student = new Student(); try { stm = connection.prepareStatement(sql); stm.setInt(1, key); rs = stm.executeQuery(); rs.next(); student.setId(rs.getInt("ID")); student.setFirst_name(rs.getString("FIRST_NAME")); student.setSecond_name(rs.getString("SECOND_NAME")); } catch (SQLException e) { e.printStackTrace(); } finally { if(rs!=null){ rs.close(); } if(connection!=null){ connection.close(); } if (stm!=null){ stm.close(); } } return student; }
@Override public List getAll() throws SQLException { String sql="SELECT * FROM student_db.student"; List list=new ArrayList<>(); Student student=new Student(); try{ stm=connection.prepareStatement(sql); rs=stm.executeQuery(); while(rs.next()){ student.setId(rs.getInt("ID")); student.setFirst_name(rs.getString("FIRST_NAME")); student.setSecond_name(rs.getString("SECOND_NAME")); list.add(student); } } catch (SQLException e){ e.printStackTrace(); } finally { if(rs!=null){ rs.close(); } if(connection!=null){ connection.close(); } if (stm!=null){ stm.close(); } } return list; } }


Ответ

Верное использование PreparedStatement заключается в том, что необходимо подготовить запрос в СУБД, прежде, чем он будет отправлен. Его нужно подготовить, сохранить в поле, а потом использовать, таким образом достигается максимальная скорость обработки любых запросов в любом кол-ве. Вот код решения моего вопроса: (sql запрос сохранил в константу)
/* Константа sql запроса */ private static final String SQL_SELECT_ALL_STUDENT = "SELECT id, first_name, second_name FROM student_db.student";
/* поле подключения */ private Connection connection = null; /* поле PS */ private PreparedStatement psSelectAllStudent = null;
// использую Properties для чтения user,password,driver,url // подключаюсь к СУБД private Connection getConnection() throws DaoException { Properties property = new Properties(); InputStream inputStream = null; try { inputStream = this.getClass().getResourceAsStream("/config.properties"); property.load(inputStream); String url = property.getProperty("url"); String user = property.getProperty("user"); String password = property.getProperty("password"); String driver = property.getProperty("driver"); Class.forName(driver); if (connection == null) { connection = DriverManager.getConnection(url, user, password); } } catch (IOException ex) { DaoException er = new DaoException("ошибка загрузки файла ", ex); throw er; } catch (ClassNotFoundException ex) { DaoException er = new DaoException("ошибка Class.forName(driver) ", ex); throw er; } catch (SQLException ex) { DaoException er = new DaoException("ошибка соединения с СУБД ", ex); throw er; } return connection; }
//подготавливаю PS в СУБД и сохраняю в поле
private void selectAllStudentPs(String sql) throws DaoException { getConnection(); try { if (psSelectAllStudent == null) { psSelectAllStudent = connection.prepareStatement(sql); } } catch (SQLException er) { DaoException ex = new DaoException("ошибка подготовки запроса в selectStudentPs ", er); throw ex; } }
//получаю список того, что было необходимо сделать в задании @Override public List selectAllStudent() throws DaoException { ResultSet resultSet=null; List list = new ArrayList<>(); try { selectAllStudentPs(SQL_SELECT_ALL_STUDENT); resultSet = psSelectAllStudent.executeQuery(); while (resultSet.next()) { Student ss = new Student(); ss.setId(resultSet.getInt("id")); ss.setFirstName(resultSet.getString("first_name")); ss.setSecondName(resultSet.getString("second_name")); list.add(ss); } } catch (SQLException ex) { DaoException er = new DaoException("ошибка выполения SQL_SELECT_ALL_STUDENT ", ex); throw er; }finally { if (resultSet != null) { try { resultSet.close(); } catch (SQLException ex) { DaoException er = new DaoException("ошибка закрытия resultSet в " + "selectStudent ", ex); throw er; } } } return list; } /* ---- */
Таким образов и получается именно ускорение PreparedStatement !

Анимация кругового прелоадера

Я пытаюсь создать анимацию Apple's OS X загрузчика.

То, что я уже попробовал:
.animation-wrapper { width: 200px; height: 200px; border: 1px solid black; border-radius: 50%; position: relative; overflow: hidden; filter: brightness(0.8); -webkit-filter: brightness(0.8); } .pie-piece1 { position: absolute; width: 50%; height: 50%; bottom: 0; left: 0; background: linear-gradient(to right, rgba(255, 0, 0, 1) 0%, rgba(255, 255, 0, 1) 100%); } .pie-piece2 { position: absolute; width: 50%; height: 50%; bottom: 0; right: 0; background: linear-gradient(to right, rgba(255, 255, 0, 1) 0%, rgba(0, 255, 0, 1) 100%); } .pie-piece3 { position: absolute; width: 50%; height: 50%; top: 0; left: 0; background: linear-gradient(to right, rgba(255, 0, 0, 1) 0%, rgba(255, 0, 255, 1) 100%); } .pie-piece4 { position: absolute; width: 50%; height: 50%; top: 0; right: 0; background: linear-gradient(to right, rgba(255, 0, 255, 1) 0%, rgba(0, 0, 255, 1) 100%); } .rotating-spinners { position: absolute; } .spike { fill: rgba(22, 22, 22, 0.5); }


Линейные градиенты неправильно направлены. Я не смог найти способ сделать градиент, идущий в двух направлениях. Есть ли способ, чтобы создать это, используя только CSS или SVG, не смешивая их, как это сделал я?
Или есть другие решения, может использовать canvas, или какую-то другую магию?
Перевод вопроса: Circle loading animation @Persijn


Ответ

ответ: Paul LeBeau
Вот моя SVG-только версия. Цвет фона колеса не идеален, но я думаю, что получилось довольно близко.

SVG плюс CSS анимация

Я хочу сделать анимацию волны, которая превращается в прямую линию. То, что есть сейчас, это анимация волны, идущей слева направо, см. ниже код. Также это может быть сделано только с помощью CSS?
body { width: 960px; height: 100%; background-color: #d3d3d3; } /*#wave1 { transform: translate(-260px, 200px); }*/ #wave1 { animation: popup 5s ease infinite; } @keyframes popup { 0% { transform: translate( -500px, 0); } 100% { transform: translate(400px, 0); } } #wave2 { animation: popup 5s ease infinite; } @keyframes popup { 0% { transform: translate( -500px, 0); } 100% { transform: translate(400px, 0); } } #wave3 { animation: popup 5s ease infinite; } @keyframes popup { 0% { transform: translate( -500px, 0); } 100% { transform: translate(400px, 0); } }
Перевод вопроса: svg plus css animation@pcuvi


Ответ

Если вы хотите, постепенно сгладить линии у волн, то можно просто анимировать их уменьшение от 1 до 0.
body { width: 960px; height: 100%; background-color: #d3d3d3; } /*#wave1 { transform: translate(-260px, 200px); }*/ #wave1 { animation: popup 5s ease infinite; } @keyframes popup { 0% { transform: translate( -500px, 0) scale(1, 1); } 100% { transform: translate(400px, 0) scale(1, 0); } }
Перевод ответа: svg plus css animation @Paul LeBeau