Страницы

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

вторник, 9 июля 2019 г.

Вывод букв\слов во время выполнения программы

Захотелось написать простенький транслятор латинских букв в азбуку Морзе и обратно.Всё получается, все хорошо, вот только хочется фичу. Фичей выбрал следующее:
По мере написания в консоль слов необходимо, чтобы программа незамедлительно выдавала перевод(иначе говоря альтернатива классу Scanner, без нажатий на энтер, прямо во время работы программы).
Возможно ли такое, если да - куда копать?


Ответ

Да, возможно. Простейший способ - использовать JLine или JLine2
Они достаточно просты в освоении и код хорошо документирован, сам недавно познакомился с данной библиотекой.

Android Java SVG залить по тапу форму цветом под пальцем

Возникла не сложная, но непонятная для меня проблема. Возможно, данный вопрос уже подымался, что было бы очевидно, но ответа я не нашел.
Есть векторное изображение (SVG), которое мы конвертируем в xml и в последующем отображаем его в ImageView. Вопрос заключается в том, как по тапу я могу поставить нужному мне , атрибут fillColor из java-кода.


Ответ

Может что то типа такого:
DrawableCompat.setTint(imageView.getDrawable(), ContextCompat.getColor(context, R.color.yourColor));
или такого:
public class TintIcon {
private static int[][] states = new int[][] { new int[] { android.R.attr.state_pressed}, new int[] { android.R.attr.state_focused}, new int[] { android.R.attr.state_selected}, new int[] { -android.R.attr.state_selected} };
private static int[] colors = new int[] { Color.parseColor("#4EA62E"), // primary color Color.parseColor("#4EA62E"), // primary color Color.parseColor("#4EA62E"), // primary color Color.parseColor("#868686") // grey icon };
private static int[] colorsSwitch = new int[] { Color.parseColor("#D7B00F"), // yellow color Color.parseColor("#D7B00F"), // yellow color Color.parseColor("#D7B00F"), // yellow color Color.parseColor("#868686") // grey icon//// };
private static ColorStateList myColorStateList = new ColorStateList(states,colors); private static ColorStateList myColorStateListSwitch = new ColorStateList(states,colorsSwitch);
public static Drawable tintIconToGreenColor(Context context, Drawable icon) { if (icon != null) { icon = DrawableCompat.wrap(icon).mutate(); DrawableCompat.setTintList(icon, myColorStateList ); DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN); } return icon; }
public static Drawable tintIconYellowColor(Context context, Drawable icon) { if (icon != null) { icon = DrawableCompat.wrap(icon).mutate(); DrawableCompat.setTintList(icon, myColorStateListSwitch ); DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN); } return icon; } }
Этих два метода tintIconToGreenColor и tintIconYellowColor красать иконку в зеленый и желтый цвет. Я его использую что бы на серой иконке менять цвет заливки рисунка.
Вот такую иконку в .png я крашу в два разных цвета:

Отображение данных пользователя из БД на всех страницах

Для того чтобы логин, авторизовавшегося пользователя, отображался на всех страницах я сделал так:
_Layout.cshtml
...

Логин: @User.Identity.Name

...
Но мне надо еще отобразить наименование школы, связанной с данным логином. Дел в том, что есть таблица в БД:
dbo.school

и логины (User.Identity.Name) совпадают с полем SchoolID. Как теперь выгрузить соответствующее поле SchoolName и отобразить его на каждой странице сайта вместе с логином.
Конечно же саму информацию выгрузить я могу, реализуя интерфейс IRepository
HomeController.cs
public class HomeController : Controller { private cokoContext context = new cokoContext(); IRepository schoolRepository; }
public HomeController() { schoolRepository = new SchoolRepository(context); }
Но как именно дальше должен сработать Контроллер со View?


Ответ

Можно сделать частичное представление.
Controller:
[ChildActionOnly] public ActionResult GetFooter() { if (Session["footer"] == null) Session["footer"] = _schoolRepository.GetById(User.Identity.Name);
School entity = (School)Session["footer"];
var model = new FooterViewModel(User.Identity.Name, entity.SchoolName);
return View(model); }
Partial View:
@model Namespace.Web.Models.FooterViewModel
@{ Layout = null; // что бы не зациклился }

Логин: @Model.UserLogin

Школа: @Model.SchoolName


Layout:
@{ Html.RenderAction("GetFooter", "Home"); }

Запретить стирать в EditText несколько первых символов

Делаю чат. В нем можно ответить человеку и в EditText в начало вставляет типа Ваня, - обращение. Как можно сделать это обращение нестираемым?


Ответ

Попробуйте такой вариант
editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override public void afterTextChanged(Editable s) { EditText edit = (EditText) getCurrentFocus(); if (edit != null) { if (!s.toString().startsWith("Ваня,")) { edit.setText("Ваня,"); Selection.setSelection(edit.getText(), edit.getText().length()); } } } });

Контекст в ноде при исполнении файла

Здравствуйте, есть вопрос, имеется такой код.
var obj = { num: 10, method: function(){ function test(){ console.log(this.num); } test(); } } obj.method(); // undefined
Он вернёт undefinded т.к контекст вызова функции test глобален. Но если мы в начале объявим переменную num и присвоем ей значение. То будет выведен результат глобального контекста.
var num = 11; var obj = { num: 10, method: function(){ function test(){ console.log(this.num); } test() } } obj.method(); //11
Проверял в ноде и браузере и оно работает. Но в ноде работает только в режиме REPL, а если я скармливаю ему скрипт из файла то возвращает результат undefined, можете пожалуйста подсказать почему так происходит?


Ответ

Отличие nodejs от браузера в том, что она уже поддерживает модули в javascript.
Важное отличие модулей заключается в том, что переменные объявленные с помощью var глобально для модуля - добавляются не в глобальный объект, а в модуль.
Любой файл расценивается как модуль, поэтому при использовании одного и того же кода в REPL и загружая из файла можно получить неожиданные результаты.
В приведенном коде можно отметить, что this внутри функции test указывается на глобальный объект (window в браузере, global в node).
При выполнении кода в браузере или REPL переменная num добавлялась в глобальный объект, и ее значение можно было получить через this
При загрузке же из файла, переменная добавляется в модуль, а не в глобальный объект поэтому ее значение нельзя было получить через this

Удаление столбцов в csv файле с помощью python

У меня есть csv файл с данными(7 столбцов и 6063 строк). Названия столбцов что-то вроде ['id', 'seller', 'buyer', 'timestamp']. И соответствующие данные в строках. Нужно очистить этот файл от строк, где seller=buyer.
import pandas as pd data=pd.read_csv('file.csv', sep=';', decimal=',') dat=pd.DataFrame(data.T) for i in dat: if dat[dat.columns[i]][1]==dat[dat.columns[i]][2]: a=dat.columns[i]
Вот что-то такое у меня получается, а вот с удалением столбцов(теперь это уже столбцы) у меня проблема, так как это не столбцы, которые идут по-порядку, а перечислять название 1450 столбцов как-то не очень хочется. Подскажите, как здесь лучше поступить?


Ответ

Воспользуйтесь методом .query()
data = pd.read_csv('file.csv', sep=';', decimal=',', quotechar="'").query('seller != buyer')
Если надо сохранить обратно в CSV:
data.to_csv('output.csv', index=False)
PS вам не нужно транспонировать DataFrame для того, чтобы отфильтровать его
PPS если вы используете Pandas то старайтесь не использовать for loop - это не очень эффективно
Вот рабочий пример с учетом того, что в вашем CSV в качестве квотирующей кавычки используется '
CSV файл - D:\temp\buyer_seller.csv
'id';'seller';'buyer';'timestamp' 1;seller-1;buyer-1;2016-01-01 2;seller-2;buyer-2;2016-01-02 3;same-1;same-1;2016-01-11 4;same-2;same-2;2016-01-22
Код:
In [21]: pd.read_csv(r'D:\temp\buyer_seller.csv', sep=';') Out[21]: 'id' 'seller' 'buyer' 'timestamp' 0 1 seller-1 buyer-1 2016-01-01 1 2 seller-2 buyer-2 2016-01-02 2 3 same-1 same-1 2016-01-11 3 4 same-2 same-2 2016-01-22
In [22]: pd.read_csv(r'D:\temp\buyer_seller.csv', sep=';', quotechar="'") Out[22]: id seller buyer timestamp 0 1 seller-1 buyer-1 2016-01-01 1 2 seller-2 buyer-2 2016-01-02 2 3 same-1 same-1 2016-01-11 3 4 same-2 same-2 2016-01-22
In [23]: pd.read_csv(r'D:\temp\buyer_seller.csv', sep=';', quotechar="'").query('seller != buyer') Out[23]: id seller buyer timestamp 0 1 seller-1 buyer-1 2016-01-01 1 2 seller-2 buyer-2 2016-01-02
Альтернативно можно просто избавиться от кавычек в именах столбцов/колонок:
In [27]: df = pd.read_csv(r'D:\temp\buyer_seller.csv', sep=';')
In [28]: df.columns.tolist() Out[28]: ["'id'", "'seller'", "'buyer'", "'timestamp'"]
In [30]: df.columns = df.columns.str.replace("'", '')
In [31]: df.columns.tolist() Out[31]: ['id', 'seller', 'buyer', 'timestamp']

Возврат на View, с которого был вызван метод другого контроллера

В дефолтном файле _Layout.cshtml, который является главным слоем, есть 2 кнопки, которые переключают язык сайта:


Есть LanguageController.cs
public class LanguageController : Controller { public ActionResult Change(string LanguageAbbrevation) { if (LanguageAbbrevation != null) { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguageAbbrevation); Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguageAbbrevation); } HttpCookie cookie = new HttpCookie("Language"); cookie.Value = LanguageAbbrevation; Response.Cookies.Add(cookie);
return View(); // В этом и проблема } }
Так же есть пустая вьюшка Change, чтобы не было ошибок.
Дело в том, что эти кнопки отображаются на каждой странице сайта и после нажатия, пользователя отправляет на страницу Change. Пользователя никуда отправлять не надо, только обновить текущую View. Как это сделать?


Ответ

Можно передавать в action дополнительным параметром URL, на который необходимо сделать возврат:
public ActionResult Change(string LanguageAbbrevation, string ReturnUrl) { // здесь все то же самое
return Redirect(ReturnUrl); }
В _Layout указываем значение этого дополнительного параметра как Request.Url.PathAndQuery

Нововведения в Rails 5, касающиеся Active Record Associations?

Совсем недавно перешел на Rails 5.0.0.1 и не совсем понимаю кое-каких вещей, связанных с ассоциациями Active Record. Либо я что-то упускаю (давно не брался за рельсы).
В 4-ой версии рельс я мог спокойно проделать следующие действия, не получив при этом ни одной ошибки.
rails g model Parent name:string rails g model Child name:string parent:references rake db:migrate
rails c
Parent.create name: "Papa" p = Parent.last Child.create name: "Son" c = Child.last
После этих нехитрых действий можно было спокойно производить следующие действия:
p.children << c # Добавить "Son" к "Papa" p.children # Вывести список всех дочерних записей c.parent # Посмотреть родителя c c.parent = p # Напрямую установить родителя для c
Это все было довольно очевидно и удобно.
Но сейчас я обновился до 5-ой версии рельс и не совсем понимаю, что происходит.
Сначала я произвел стандартные операции:
rails g model Parent name:string rails g model Child name:string parent:references rails db:migrate
Ничего нового.
rails c
Parent.create name: "Papa" p = Parent.last Child.create name: "Son" # *
И в строке (*) я натыкаюсь на нечто. Что именно - точно сказать не могу. Конкретно происходит следующее:
(0.1ms) begin transaction (0.1ms) rollback transaction
Судя по всему дело в том, что я не указал, к какому родителю относится потомок, потому как если сделать что-то типа
p.children.create name: "Son"
То тогда я уже никаких роллбэков не получаю и транзакция выполняется.
Собственно, вопрос: я что-то упускаю/делаю неправильно, или действительно больше нельзя создавать модель, которая является наследником другой модели, не указывая при этом родителя? И если это так, то есть ли какой-то способ вернуть прежнее поведение? Ведь может быть такая ситуация, что есть много дочерних моделей и много родителей, но не все дочерние используются. Как тогда их создавать?


Ответ

Во-первых, запустите последнюю команду с bang-методом create! вместо create - тогда в консоли увидите причину невыполнения операции:
p.children.create! name: "Son"
Во-вторых, вы верно предположили - в консоли вы увидите объяснение, что у объекта модели Child не указан обязательный параметр parent. Почему обязательный? Потому что в Rails 5 все связи belongs_to стали обязательными по-умолчанию.
В четвертых рельсах:
belongs_to :parent # по-умолчанию необязательная связь belongs_to :parent, required: true # уточняем обязательность связи
В пятых рельсах:
belongs_to :parent # по-умолчанию обязательная связь belongs_to :parent, optional: true # уточняем необязательность связи

Убрать символ перевода строки из регулярки

Нужно убрать символ перевода строки из регулярки, чтоб его не резал. Никакой таблицы символов не нашёл, может кто знает за каким кодом он стоит?
preg_replace('/([^\pL\pN\pP\pS\pZ])|([\xC2\xA0])/u', ' ', $string);
Вся функция:
function istrip($string) { $old_string = $string; $string = strip_tags($string); $string = preg_replace('/([^\pL\pN\pP\pS\pZ])|([\xC2\xA0])/u', ' ', $string); $string = str_replace(' ',' ', $string); $string = trim($string);
if ($string === $old_string) { return $string; } else { return istrip($string); } }
Regex


Ответ

Чтобы не резало, нужно не убрать, а добавить символ \pC(соединяющая пунктуация) :
preg_replace('/([^\pL\pN\pP\pS\pZ\pC])|([\xC2\xA0])/u', ' ', $string);

Помогите плиз, не могу проиндексировать сайт на angularjs

Доброго времени суток. В общем я буду описывать ситуацию, чтоб было более менее понятно что к чему. У меня есть проект на angularjs, надо проиндексировать в Google
Сам Google говорит, что если вставить в header сайта мета тег , то поисковая машина понимает, что на сайте есть ajax контент и он ссылки типу http://sitename/#!/blog/news читает как http://sitename?_escaped_fragment_=blog/news
Я сделал следующее:
в angularjs
Application.config(['$locationProvider',function($locationProvider){ $locationProvider.hashPrefix('!'); $locationProvider.html5Mode(true); }]); Написал мини движок, который выдает контент для Google по ссылке: http://sitename/api/html?page=blog/news В .htaccess перенаправляю все запросы, где есть get параметр _escaped_fragment_ на api статики:
RewriteCond %{REQUEST_URI} ^/$ RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/?(.*)$ RewriteRule ^(.*)$ /api/html?page=%1 [NC,R=301,L] Тест на ссылки http://sitename?_escaped_fragment_=blog/news - все хорошо, перенаправляет на http://sitename/api/html?page=blog/news и показывается нужный контент.
И как бы все хорошо и все должно работать правильно, но проверяю ссылки сайта в google.com/webmasters/tools - и там подтягивается html angularjs проекта (тот в котором я вставил мета тег ), и я так понимаю, что Google даже не обращает внимания на
Вопрос: что я делаю не так, как мне это все исправить? может кто то с этим столкнулся, может кто то может дать совет?


Ответ

Год назад это все отменили https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html Ищите другие способы или пишите свой велосипед (например можете сделать генерацию страниц на php или nodejs именно для ботов, а в .htaccess перенаправить всех ботов на url этих специальных страниц)

Переход на каталог ниже или выше

Нужно создать дерево каталогов. Допустим понятно как просмотреть все файлы в каталоге и все папки, а как после просмотра всего этого перейти на каталог выше или ниже ?
string path = Directory.GetCurrentDirectory(); string[] files = Directory.GetFiles(path); string[] directory = Directory.GetDirectories(path); for (int i = 0; i < 10; i++) { label2.Text = label2.Text + files[i].ToString() + "
"; } for (int j = 0; j < 10; j++) { label3.Text = label3.Text + directory[j].ToString() + "
"; }
Не уверен, что верно всё это делаю, но как знаю. И еще вопрос: как определить количество файлов или папок в директории, чтобы прописать его в условии ?


Ответ

Перейти ниже можно получив список папок в текущей директории, что у вас и сделано (Directory.GetDirectories()).
Перейти выше можно, используя свойство DirectoryInfo.Parent
string path = Directory.GetCurrentDirectory(); var info = new DirectoryInfo(path); Console.WriteLine(info.Parent?.Name ?? "this is a root directory");
Однако при построении дерева каталогов переход на каталог выше вам ни к чему. Достаточно обхода вниз. Пример обхода с рекурсией:
public void DirSearch(string path) { try { foreach (string d in Directory.GetDirectories(path)) { foreach (string f in Directory.GetFiles(d)) { Console.WriteLine(f); } DirSearch(d); } } catch (Exception e) { Console.WriteLine(e.Message); } }
...
string path = Directory.GetCurrentDirectory(); DirSearch(path);

Чтение опр.колво байтов из файла

Всем добрый вечер. Возник вот такой вопрос: Допустим у меня есть файл,я хочу считать с него 128 байт и перевести их в string с помощью класса Encoding. Но при этом у меня в этих 128 байтов занято только 32. Строковая переменная после использования класса Encoding, может выглядеть примерно так: firstdsda (Допустим это 32 байт), а дальше все выглядит в таком виде 0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 (это допустим те 96 оставшиеся,то есть пустые байты).
Если выводить эту переменную с помощью Messagebox.show(Это строка); то текст в начале, а дальше идут пустые байты но их не видно.
Так вот как можно при выводе\показе\ и так далее отрезать оставшееся пустые байты?


Ответ

Попробуйте
s.TrimEnd('\0');
(s — ваша строка, полученная из Encoding.GetString).
Это мне кажется лучше, чем убирать финальные нули из массива байт, т. к. они могут быть важны в вашей кодировке.

Как установить размер заглушки ImageView не зная точных размеров получаемого изображения?

Есть LinearLayout, в который добавляется N'ое количество ImageView. Изображения загружаются с помощью библиотеки "Picasso":
Picasso.with(activity.getApplicationContext()) .load(listUrls.get(0)) .placeholder(R.drawable.img_holder) .into(postImage);
Собственно вопрос по заглушке для ImageView .placeholder(R.drawable.img_holder) - заглушка не соответствует размеру изображения, игнорирует ScaleType. Точный размер изображения до его скачивания узнать невозможно (изображения тянутся с Vk) Как в таком случае подстроить заглушку по размер изображения?


Ответ

Есть несколько вариантов. Каждый из них имеет свои особенности. Один из них - не использовать метод placeholder(int res), а установить заглушку стандартными средствами в разметке атрибутом src.
Так все параметры типа ScaleType будут задействованы.

Скрипт на проверку занятости js

Есть скрипт где возможно выбрать страну-регион-город








0) { echo "
Размещение рекламы в этом городе не доступно."; }else{ echo "
Размещение рекламы в этом городе доступно."; } } ?>
Как сделать, чтобы данный код работал в select В данный момент ошибка Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in


Ответ

Нужно проверять возвращаемые ошибки
$result = mysql_query( "SELECT count(*) FROM users WHERE first_name='" . $_POST["name"] . "'" ); if (!$result) die(mysql_error()); $row = mysql_fetch_row($result); if ($row === false) die('Empty set'); $user_count = $row[0];

Как заполняется массив в ArrayList Java

Суть задачи состоит в создании ArrayList и добавлении в него обычных массивов, которые затем необходимо заполнить данными. Появился такой вопрос, каким образом заполняются массивы в ArrayList? Конкретно непонятна запись во внутреннем цикле:
for (int i = 0; i < nums.size(); i++) { for (int j = 0; jЗдесь представлен весь код метода:
public static ArrayList createList() { ArrayList nums = new ArrayList(); nums.add(new int[5]); nums.add(new int[2]); nums.add(new int[4]); nums.add(new int[7]); nums.add(new int[0]); Random r = new Random(); for (int i = 0; i < nums.size(); i++) { for (int j = 0; j

Ответ

Метод get(i) объекта nums типа ArrayList возвращает i-ый элемент списка nums, коим является объект типа int[] – массив целых чисел. Далее, во внутреннем цикле этот массив инициализируется значениями.

Canvas - записать координаты в массив

Это холст, на котором можно рисовать что-либо мышью. Моя задача состоит в том, чтобы сохранить координаты нарисованных линий в массиве. Для этого мне нужен цикл. Но при каждом новом действии все переменные обнуляются и вызываются заново. Так в данном коде alert(i) - постоянно выводит единицу "1", соответственно когда я добавляю координаты в массив, они всегда встают на одно и то же место и вместо накопления, просто заменяют друг друга.
Как можно записать нужные мне координаты в массив ?
window.onload = function() { canvas = document.getElementById("drawingCanvas"); context = canvas.getContext("2d");
canvas.onmousedown = startDrawing; canvas.onmousemove = draw; };
function startDrawing(e) { // Начинаем рисовать isDrawing = true;
// Создаем новый путь (с текущим цветом и толщиной линии) context.beginPath();
// Нажатием левой кнопки мыши помещаем "кисть" на холст context.moveTo(e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop); };
function draw(e) {
if (isDrawing == true) { var i = 0; // Определяем текущие координаты указателя мыши var x = e.pageX - canvas.offsetLeft; var y = e.pageY - canvas.offsetTop;
// Рисуем линию до новой координаты context.lineTo(x, y); context.stroke();
var coord_arr = []; coord_arr.splice(i, 0, { x: x, y: y });
i++; alert(i) }
};


Ответ

Вам не нужно сохранять координаты линий, Вам нужно сохранять координаты курсора и рисовать по ним линии.
document.addEventListener( 'mousedown', document_mousedownHandler );
const path = { coords: null };
function document_mousedownHandler( event ){ path.coords = [];
document.removeEventListener( 'mousedown', document_mousedownHandler );
document.addEventListener( 'mouseup', document_mouseupHandler ); document.addEventListener( 'mousemove', document_mousemoveHandler ); } function document_mouseupHandler( event ){ path.coords = null;
document.removeEventListener( 'mouseup', document_mouseupHandler ); document.removeEventListener( 'mousemove', document_mousemoveHandler ); document.addEventListener( 'mousedown', document_mousedownHandler ); } function document_mousemoveHandler( event ){ path.coords.push( { x: event.clientX, y: event.clientY } ); }
Все что Вам осталось, это вызывать метод render и в цикле рисовать по координатам.

Как поставить свою иконку на push уведомления firebase, когда приложение в фоне или закрыто?

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


Ответ

Да, в метод onMessageReceived приходят сообщения только когда приложение активно. Когда приложение в фоне - сообщения сразу попадает в нотификации. Вы можете установить свойство click_action на это сообщение а у себя в приложении ловить его через intent-filter.
Пример
тело сообщения которое отправляет сервер:
var message = new gcm.Message({ collapseKey: 'data', priority: 'high', contentAvailable: true, delayWhileIdle: false, timeToLive: 10000,
data: { message: 'Message from gcm server', action: 'some action' },
notification: { tag : 'hasData', title: "English for Founders", icon: "ic_launcher", color: "#22C064", sound: "notification_sound", body: "This is a GCM notification that will be displayed ASAP.", click_action: "OPEN_APP" // make intent-filter in Manifest.xml for this action } });
У вас в Manifest.xml прописан фильтр на action - OPEN_APP на определенное активити.
В итоге телефон получит push-уведомление из которого вы сможете получить click_action и когда Activity запуститься, в методе onCreate вы с можете получить еще и data с этого сообщения, вот так:
public static void parseExtras (Bundle intentExtras){ if (intentExtras != null) { for (String key : intentExtras.keySet()) { try { String value = intentExtras.getString(key); Log.wtf(TAG, "Key: " + key + " Value: " + value); }catch (ClassCastException e){ Log.wtf(TAG, "Cannot parse extras, ClassCastException");} } } }
А картинку если вам надо отображать, пропишите ее название в теге icon

Не отображактся новое окно при RequestNavigation в Prism

Использую в приложении WPF и Prism c UnityContainer. Внутри приложения запускается отдельное окно со следующим содержимым:

То есть окно содержит регион, в котором по нажатию соответствующей RadioButton будет меняться содержимое. Для этого имеются соответствующие подокна и в стартовом модуле происходит их инициализация:
RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeAutoView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSingleView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSelectView));
При открытии окна из программы исполняется следующий код:
var schemeView = unityContainer.Resolve();
regionManager.Regions.Remove("TypeSchemeRegion"); RegionManager.SetRegionManager(schemeView, regionManager);
(SchemeView это самое запускаемое окно) В этом месте все три подокна имеются в списке Views у региона, активным окном (ActiveView) является SchemeAutoView. При старте окна отображается содержимое подокна SchemeAutoView. По нажатию соответствующей RadioButton исполняется код:
_regionManager?.RequestNavigate("TypeSchemeRegion", new Uri("SchemeSingleView", UriKind.Relative));
или:
_regionManager?.RequestNavigate("TypeSchemeRegion", new Uri("SchemeSelectView", UriKind.Relative));
Теперь, если проверить в Debuge содержимое региона, то активное окно соответственно меняется. Однако на экране ничего не происходит, по-прежнему отображается первое активное подокно. Для всех окон используется одна ViewModel. Самое интересное, что в главном окне приложения (Shell) используется эта же методика и все работает на "ура", а в отдельном окне не хочет работать. Что делаю не так?


Ответ

Нашел ошибку сам. Оказывается при работе с Prism, если стартуешь внутри программы новое окно, которое, скажем так, не находиться в контексте главного окна (Shell), необходимо процедуру регистрации окон в регионах повторять почти так же, как в стартовом модуле. Ну или, по крайней мере, у меня так произошло. Итак код при старте нового окна:
regionManager.Regions.Remove("TypeSchemeRegion"); var schemeView= unityContainer.Resolve(); RegionManager.SetRegionManager(schemeView, regionManager); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeAutoView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSingleView)); RegionManager.RegisterViewWithRegion("TypeSchemeRegion", typeof(SchemeSelectView));
И еще очень важно сначала удалить необходимый регион, затем обязательно сделать Resolve соответствующего окна. В этот момент к окну привязывается ViewModel (если это необходимо) через Dependency Property, затем необходимо произвести переустановку RegionManager и новую привязку окон к региону. Дальше в соответствующих местах RequestNavigate работает без проблем.

Если блок не помещается на текущей странице, то перенести его на следующую

Если блок не поместился на текущей странице в печатной форме, нужно сделать его перенос на следующую страницу. Как можно реализовать?


Ответ

Воспользуйтесь свойством page-break-inside, установив у родительского элемента значение avoid
body { page-break-inside: avoid }

Длинный элемент 1
Длинный элемент 2

Toolbar цвет текста черный


Как сделать белым текст, в приложении показывает белым


Ответ

toolbar.setTitleTextColor(0xFFFFFFFF);
или
toolbar.setTitleTextColor(android.graphics.Color.WHITE);
или через styles.xml добавляете итем в стиль для AppCompat
TITLE_COLOR_GOES_HERE
или добавьте в xml в тег toolbar'a

Имя события проблемы: CLR20r3 Сигнатура проблемы 04: mscorlib Сигнатура проблемы 09: System.IO.FileNotFoundException

Проект: (WinForms, DevExpress, .NET FW 4.5) клиент для сервиса. Делался на Windows Server 2008 R2. Скомпилированый проект на этой машине работает. На машине с Windows 8.1 и установленной VS - тоже работает. На машине с Windows 8.1 без VS - не работает! Выдаёт такую ошибку:
Имя события проблемы: CLR20r3 Сигнатура проблемы 01: Client.exe Сигнатура проблемы 02: 1.0.0.0 Сигнатура проблемы 03: 58047f7c Сигнатура проблемы 04: mscorlib Сигнатура проблемы 05: 4.6.1055.0 Сигнатура проблемы 06: 563c0eac Сигнатура проблемы 07: 40fd Сигнатура проблемы 08: 0 Сигнатура проблемы 09: System.IO.FileNotFoundException Версия ОС: 6.3.9600.2.0.0.256.48 Код языка: 1049 Дополнительные сведения 1: 5861 Дополнительные сведения 2: 5861822e1919d7c014bbb064c64908b2 Дополнительные сведения 3: 1318 Дополнительные сведения 4: 13181ae637ac2592fac0ca2dd662cdcc
System.IO.FileNotFoundException - натолкнул на мысль что не находит какую то .dll. Для всех библиотек, для которых можно было, установил свойство "копировать локально" = true. Проблему не решило!
CLR20r3 и mscorlib - подвели к тому что, может чем то ФреймВорк не нравится. Установка .NET FW 4.6, установка обновлений винды, отключение и последующее включение компонентов .NET FW 3.5 и 4.5. - Не помогло!
С помощью вот этой статьи пытался определить место где вылетает исключение. Но к сожалению ничего не получилось.... Команды описанные в примере у меня не заработали. (в полне возможно из неправильного их использования!)
0:007> .loadby sos mscorwks Unable to find module 'mscorwks' 0:007> !token2ee mscorlib 06000040fd No export token2ee found
Запустил через WinDbg .exe и выполнил !analyze -v , получил такой результат:
*** WARNING: Unable to verify checksum for Client.exe GetUrlPageData2 (WinHttp) failed: 12002.
DUMP_CLASS: 2
DUMP_QUALIFIER: 0
FAULTING_IP: ntdll!LdrpDoDebuggerBreak+2b 77123c7d cc int 3
EXCEPTION_RECORD: (.exr -1) ExceptionAddress: 77123c7d (ntdll!LdrpDoDebuggerBreak+0x0000002b) ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 1 Parameter[0]: 00000000
FAULTING_THREAD: 00000f14
PROCESS_NAME: Client.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {
EXCEPTION_CODE: (NTSTATUS) 0x80000003 (2147483651) - {
EXCEPTION_CODE_STR: 80000003
EXCEPTION_PARAMETER1: 00000000
WATSON_BKT_PROCSTAMP: 58047f7c
WATSON_BKT_PROCVER: 1.0.0.0
PROCESS_VER_PRODUCT: Client
WATSON_BKT_MODULE: ntdll.dll
WATSON_BKT_MODSTAMP: 56bb4e1d
WATSON_BKT_MODOFFSET: b3c7d
WATSON_BKT_MODVER: 6.3.9600.18233
MODULE_VER_PRODUCT: Microsoft® Windows® Operating System
BUILD_VERSION_STRING: 6.3.9600.17415 (winblue_r4.141028-1500)
MODLIST_WITH_TSCHKSUM_HASH: 049de938cde16004d3def1c8a595a334e160586f
MODLIST_SHA1_HASH: d5aa0548e0a0e33ed79e20de3a62e9bdc9b1ccb5
NTGLOBALFLAG: 70
APPLICATION_VERIFIER_FLAGS: 0
PRODUCT_TYPE: 1
SUITE_MASK: 272
ANALYSIS_SESSION_HOST: TECHDIR
ANALYSIS_SESSION_TIME: 10-20-2016 00:27:11.0873
ANALYSIS_VERSION: 10.0.14321.1024 x86fre
THREAD_ATTRIBUTES: ADDITIONAL_DEBUG_TEXT: Followup set based on attribute [ProcessUpTime] from Frame:[ffffffff] on thread:[PSEUDO_THREAD] ; Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD]
LAST_CONTROL_TRANSFER: from 770f853c to 77123c7d
THREAD_SHA1_HASH_MOD_FUNC: 89f7b183a84958ac40c6d818861d72cb316fd6a3
THREAD_SHA1_HASH_MOD_FUNC_OFFSET: 3eede2065008e01cabea48725a58fa684c801148
OS_LOCALE: RUS
PROBLEM_CLASSES:

LOADER_INIT_FAILURE Tid [0x0] Frame [0x00] String [80000003] Data Bucketing
BUGCHECK_STR: LOADER_INIT_FAILURE_80000003
DEFAULT_BUCKET_ID: LOADER_INIT_FAILURE_80000003
STACK_TEXT: 00000000 00000000 Client.exe!unknown_function+0x0
THREAD_SHA1_HASH_MOD: 5e896533852c8e3b62be2d4b1d9e6cdc08d10c5e
SYMBOL_STACK_INDEX: 0
SYMBOL_NAME: Client.exe!unknown_function
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: Client
IMAGE_NAME: Client.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 58047f7c
STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ** Pseudo Context ** ; kb
BUCKET_ID: LOADER_INIT_FAILURE_80000003_Client.exe!unknown_function
PRIMARY_PROBLEM_CLASS: LOADER_INIT_FAILURE_80000003_Client.exe!unknown_function
FAILURE_EXCEPTION_CODE: 80000003
FAILURE_IMAGE_NAME: Client.exe
BUCKET_ID_IMAGE_STR: Client.exe
FAILURE_MODULE_NAME: Client
BUCKET_ID_MODULE_STR: Client
FAILURE_FUNCTION_NAME: unknown_function
BUCKET_ID_FUNCTION_STR: unknown_function
BUCKET_ID_OFFSET: 0
BUCKET_ID_MODTIMEDATESTAMP: 58047f7c
BUCKET_ID_MODCHECKSUM: 0
BUCKET_ID_MODVER_STR: 1.0.0.0
BUCKET_ID_PREFIX_STR: LOADER_INIT_FAILURE_80000003_
FAILURE_PROBLEM_CLASS: LOADER_INIT_FAILURE_80000003
FAILURE_SYMBOL_NAME: Client.exe!unknown_function
FAILURE_BUCKET_ID: LOADER_INIT_FAILURE_80000003_80000003_Client.exe!unknown_function
WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/Client.exe/1.0.0.0/58047f7c/ntdll.dll/6.3.9600.18233/56bb4e1d/80000003/000b3c7d.htm?Retriage=1
TARGET_TIME: 2016-10-19T21:27:18.000Z
OSBUILD: 9600
OSSERVICEPACK: 17415
SERVICEPACK_NUMBER: 0
OS_REVISION: 0
OSPLATFORM_TYPE: x86
OSNAME: Windows 8.1
OSEDITION: Windows 8.1 WinNt SingleUserTS
USER_LCID: 0
OSBUILD_TIMESTAMP: 2014-10-29 03:58:22
BUILDDATESTAMP_STR: 141028-1500
BUILDLAB_STR: winblue_r4
BUILDOSVER_STR: 6.3.9600.17415
ANALYSIS_SESSION_ELAPSED_TIME: 6b88
ANALYSIS_SOURCE: UM
FAILURE_ID_HASH_STRING: um:loader_init_failure_80000003_80000003_client.exe!unknown_function
FAILURE_ID_HASH: {e7bd1b86-fd09-d247-c63c-daeceefef413}
Followup: MachineOwner ---------
Но разобраться в этом и понять почему вылетает исключение - не смог...... Может кто то знает как решить эту проблему, ну или хотя бы сможет проконсультировать как узнать с помощью дебагера, где вылетает исключение... Буду благодарен за любую помощь.


Ответ

Суть проблемы была в том что я использовал кучу библиотек DevExpress, и вот какой то из них(или всем сразу) не хватало другой девовской либы - DevExpress.Images.v15.1. После того как я добавил на неё ссылку, и установил "Копировать локально"= true. Всё заработало! Большущая благодарность @Dmitriy Nemykin за наводку!!!!!!

Не отображается состояние Indeterminate на панели задач в Windows7

Простое воспроизведение проблемы. Создаем окно, указываем:

Запускаем в Windows7 - на панели ничего не отображается.
Запускаем в Windows10 - на панели ожидаемый бегающий статус-бар.


Ответ

Внезапно и неожиданно - помогло выключение и включение настройки:

Доступ к меняющимся значениям скрипта другого объекта Unity

Есть один объект, на нем есть скрипт с public значениями. Есть другой объект, на нем скрипт, который должен брать некоторые переменные из первого и их выводить.
Сейчас это выглядит так
void Start() { AxisX = GameObject.FindGameObjectWithTag("Joystick").GetComponent().AxisX; }
private void OnGUI() { GUI.Label(new Rect(0, 0, 300, 30), "AxisX = " + AxisX.ToString("F3"); }
Он получает значения на старте, но они нулевые. Вероятно, дело в том что он их получает один раз?
Но ставить в Update функцию с FindGameObject и GetComponent - весьма нагрузочно.
Какое более простое решение получить изменяющиеся значения из скрипта другого объекта?


Ответ

Сделать во втором скрипте ссылку не на поле AxisX(скорей всего это не ссылочный тип !?), а на компонент.
// Назначить в редакторе. public FloatSpeedXYJoystick _AxisX;
void Start() { // Или найти тут. if(_AxisX == null) _AxisX = GameObject.FindGameObjectWithTag("Joystick"). GetComponent() }
private void OnGUI() { GUI.Label(new Rect(0, 0, 300, 30), "AxisX = " + _AxisX.AxisX .ToString("F3"); }

Задать Laravel и Composer определенную версию PHP

На сервере имеются разные версии PHP. От 5.2 до 7.0. По умолчанию используется (/usr/bin/php) 5.4. Менять, к сожалению нельзя. Но, в папках /opt/php/bin лежат другие версии интерпретатора.
Так вот, вопрос в том, как заставить Composer и Laravel использовать не /usr/bin/php, а /opt/php70/bin/php?
Larevel не проверял, но Composer, как я понял, проверяет целостность самого себя, так что "исполняемый" файл не изменить. Была идея заменить первую строчку (!#/usr/bin/env php) на что то свое, но не срослось. (а может быть я что то не то там прописывал)
Два дня уже копаю интернет, но так ни чего и не нашел.
На всякий случай, панель на сервере - ISPManager. Ось - CentOS 7


Ответ

В общем, спустя почти 2 года, снова встал этот вопрос.
В итоге, единственный выход, который я для себя нашел и который работает: заменить php "по умолчанию".
Переименовал /usr/bin/php в /usr/bin/php5
mv /usr/bin/php /usr/bin/php5
Создал симлинк на опциональный PHP версии 7.2 в /usr/bin/
ln -s /opt/php72/bin/php /usr/bin/php

Matplotlib. Как реализовать скроллбар?

Всем привет. Пытаюсь изучать язык Python + библиотеку Matplotlib и на данный момент я застрял с некоторыми моментами: https://i.stack.imgur.com/qFz7e.png
Первый:
Я не знаю, как я могу удалить (в окне), нотации (axex: х,Y и их координаты) которые видно на скрине?
Второй:
Я хотел бы знать - могу ли я установить полосу прокрутки на любом графике? Я имею в виду, мне нужна фиксированная Ширина на графике и если содержание (какое-то количество точек или японские свечи) внутри него будут расти(по ширине) - мне нужно появление полосы прокрутки с низу чарта.
Это можно реализовать на нейтивном Python + matplotlib? (без wx Python, tkinter и т.д. и т.п.)
P. S. Буду признателен за любые конструктивные советы.


Ответ

Что касается полосы прокрутки, то ее можно сделать при помощи виджета "Slider", но это будет не совсем просто.
Попробуйте вот такой пример:
from matplotlib.widgets import Slider import math
import matplotlib.pyplot as plt
fig, ax = plt.subplots() plt.subplots_adjust(left=0.25, bottom=0.25)
t = [i / 100. for i in range(0, int(math.pi) * 100, 1)]
s = [math.sin(i * 20) for i in t] l, = plt.plot(t, s, lw=2, color='red') plt.axis([0, 1, -10, 10])
axcolor = 'gray' ax_x_pos = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
wsize = 10
x_pos = Slider(ax_x_pos, 'Position', 0, len(t) - wsize - 1, valfmt='%d', valinit=0)
ax.set_xlim(t[0], t[wsize]) ax.set_ylim(-1.1, 1.1)
def update(val): print(x_pos.val) pos = int(x_pos.val) ax.set_xlim(t[pos], t[pos + wsize]) fig.canvas.draw_idle()
x_pos.on_changed(update)
plt.show()
Чтобы убрать отображение координат, необходимо заменить функцию вывода на "пустышку":
import matplotlib.pyplot as plt
plt.figure(1) plt.plot([1, 2, 3]) plt.gca().format_coord = lambda x, y: '' plt.show()

Чем отличается анонимная функция от именованной?

Понятно что анонимная функция не имеет имени. Есть ли еще какие то отличия кроме указанной? В частности интересует каким контекстом выполнения она владеет кроме своего, а то есть к каким пространствам имен она имеет доступ.


Ответ

С точки зрения поведения (определения this, создания замыканий, объявления внутри переменных) разницы между именованной и анонимной функцией - нет
Если обратиться к спецификации, можно отметить, что функции можно разделить на FunctionDeclaration и FunctionExpression
FunctionDeclaration может быть анонимной только при объявлении ее как export default, при этом, при создании объекта функции ей присваивается имя default
Что касается FunctionExpression: к именованному FunctionExpression можно обращаться в его теле по имени, что позволяет делать рекурсивные вызовы.

Как добавлять инкремент(i) в css класс на pug(он же бывший jade)?

На нативном javascript это было-бы примерно следующим образом:
HTML:


Js:
var buttons = document.querySelectorAll('.btns');
for(i=0; iPug:
- var modalList = [{ title: "Многокамерная съемка", posterImage: "content/video.jpg", description: 'Мы используем камеры Panasonic, Sony, Blackmagic, Go Pro.Съемка на несколько камер с возможностью прямой трансляции, проекторы, плазменные панели. Онлайн трансляции в сети Интернет: 720р, 1080р, 4К.В нашем арсенале мультироторы для съемки верхних планов с 3-х осевой стабилизацией и возможностью передачи сигнала на пульт видеоинженеров (с дальнейшей трансляцией на экраны или в сеть).Кинематографические краны и тележки обеспечивают подвижность картинки и необходимую плавность кадра. Тросовая гиростабилизированная система подвеса с длиной кабельной линии до 100 метров позволяет снимать большие спортивные мероприятия и концерты непосредственно над зрителями.Благодаря оптическим удлинителям сигнала работа операторов проходит на значительном удалении от пультовой. Изображение передается в формате высокой четкости.' }, {title: "blabla"} ];
mixin modal-tackles(tackles) .modal.modal-contact.fade.tackles__modal_(здесь должен быть инкремент)(tabindex="-1", role="dialog", aria-labelledby="exampleModalLabel") .modal-dialog(role="document") .modal-content .modal-header span= tackles.title button.close(type="button",data-dismiss="modal", aria-label="Close") span(aria-hidden="true") x .modal-body
for tackles in modalList +modal-tackles(tackles)


Ответ

Вместо for в данном случае лучше использовать each, так как он позволяет получить индекс текущей итерации.
Далее этот индекс нужно передать в mixin.
Так как классы не поддерживают интерполяцию, класс, который надо собирать динамически нужно перенести в атрибуты.
В итоге должно получиться что-то такое:
for tackles, index in modalList +modal-tackles(tackles, index)
И в mixin:
mixin modal-tackles(tackles, index) .modal.modal-contact.fade(class=`tackles__modal_${index}`, tabindex="-1", role="dialog", aria-labelledby="exampleModalLabel")

Прародитель класса

В Ruby класс является объектом. Окей. Тогда у этого класса должен быть класс, который этот класс создал.
Выходит, что этот класс -- Class
class Viktor
end
puts Viktor.class.name # => "Class"
Но дальше самое интересное
puts Class.class.name # => "Class"
irb(main):020:0> Class === Class.class => true irb(main):021:0> Class === Class.class.class => true
Т.е. класс, как объект, создаётся сам собой.
Пожалуйста, объясните мне природу этого явления. Является ли он синглтоном?


Ответ

Нашёл на английском SO ответ на схожий вопрос. Приведу здесь вольный перевод.

Как и в большинстве других языков, в Ruby есть некоторые базовые экземпляры, существование который изначально заложено в языке. Они спустились с небес, материализовались из тонких материй, появились на свет магическим образом.
Вот список этих магических вещей:
Object не имеет суперкласса, но вы не можете определить объект без суперкласса, прямым суперклассом (пусть и не всегда явно) является Object. [Замечание: суперкласс для Object можно задать, но в конце концов, всегда будет объект, у которого не окажется суперкласса.] Object является экземпляром класса Class, который является субклассом Object (что значит, Object косвенно является экземпляром самого Object) Class является субклассом Module, который является экземпляром Class Class является экземпляром Class
Ничто из этих вещей нельзя объяснить в Ruby.
BasicObject, Object, Module and Class -- все они должны быть созданы в один и тот же момент, потому что они имеют цикличную зависимость друг от друга.
Тот факт, что подобные зависимости не могут быть объяснены на языке Ruby, не значит, что спецификации языка Ruby не могут сказать, что так должно быть. Это уже задача исполнителя: разобраться с тем, как это осуществить. В конце концов, Ruby-исполнитель имеет тот доступ к объектам, которого у программиста попросту нет.
Например, Ruby-исполнитель для начала может создать BasicObject, задав указатели его superclass и class равными null
Затем создать Object, задав superclass равным BasicObject и class равным null
Затем создать Module, задав superclass равным Object и class равным null
Наконец, создать Class, задав его superclass равным Module и class равным null
Теперь переназначить указатели на Class для BasicObject Object,ModuleиClassравнымиclass`.
Всё это довольно легко проделать извне, но трудно представить, как бы осуществить это изнутри.
Как только они начали существовать, совершенно возможно осуществить большую часть их функционала в чистом Ruby. Вам только нужно иметь голый скелет этих классов, т.к. благодаря открытым классам Ruby, мы можем дополнять их функционал в любое время.
Выполнение class Class не создаёт нового класса с именем Class, а открывает уже существующий класс Class, который уже был нам предоставлен средой исполнения.
Так что весьма просто представить стандартное поведение Class#new на чистом Ruby:
class Class def new(*args, &block) obj = allocate # another magic thing that cannot be explained in Ruby obj.initialize(*args, &block) return obj end end
[Замечание: на самом деле, initialize -- приватный метод, так что вам нужно использовать obj.send(:initialize, *args, &block), чтобы обойти ограничения доступа.]
Кстати, Class#allocate -- ещё один магический трюк. Он выделяет новый пустой объект в пространстве объектов Ruby, что не может быть осуществлено средствами самого Ruby. Так что Class#allocate -- это что-то, что должно быть также предоставлено средой исполнения.

От себя добавлю, что в исходном коде RubyMine (rubystubs23/class.rb) можно найти комментарий, довольно доходно всё объясняющий:
# Classes, modules, and objects are interrelated. In the diagram # that follows, the vertical arrows represent inheritance, and the # parentheses metaclasses. All metaclasses are instances # of the class `Class'. # +---------+ +-... # | | | # BasicObject-----|-->(BasicObject)-------|-... # ^ | ^ | # | | | | # Object---------|----->(Object)---------|-... # ^ | ^ | # | | | | # +-------+ | +--------+ | # | | | | | | # | Module-|---------|--->(Module)-|-... # | ^ | | ^ | # | | | | | | # | Class-|---------|---->(Class)-|-... # | ^ | | ^ | # | +---+ | +----+ # | | # obj--->OtherClass---------->(OtherClass)-----------...
Приблизительный перевод комментария над диаграммой:
Классы, объекты и модули взаимосвязаны. В диаграмме ниже вертикальные стрелки означают наследование, а скобочки -- метакласс. Все метаклассы являются экземплярами класса Class

Большая MYSQL таблица (более 200 000 000 записей). Как расставить индексы?

Есть большая (на мой взгляд) MYSQL таблица (19 полей). Даже запрос SELECT COUNT(*) FROM table_name; выполняется 6 минут, что меня не очень устраивает. Нужно расставить индексы так, чтобы не испортить дела окончательно и быстро производить выборки по нескольким определенным полям (примерно 5-7 из 19). Можно ли добавлять индексы к уже заполненной таблице, и сколько по времени это будет происходить?


Ответ

Добавление индекса на большой табличке
Добавить индекс можно всегда. Вопрос в том, что при этом произойдёт постороннего. В зависимости от storage engine и версии СУБД.
mysql/innodb до 5.6 при добавлении индекса заблокируют таблицу на запись. Т.е. все insert, update, delete запросы будут ждать окончание создания индекса. select работать сможет. Начиная с 5.6 - создание индекса возможно конкурентное.
Если вы на старой версии - то классический трюк был поднять репликацию, затем на слейве создать индекс, подождать, пока слейв догонит мастер, переключить слейв в новый мастер. Этот же трюк должен получиться с любым storage engine.
Сколько времени займёт создание индекса - в зависимости от объёма данных и железки, на которой крутится mysql
count
Просто не используйте count на больших наборах строк. Для аналитики - считайте отдельно. Для тяжёлой аналитики нормальное решение - отдельная железка с репликацией базы только для запросов расчёта аналитики.
Или считать count'ы отдельно, редисом, или колоночными субд. Или триггерами, если читать количество надо гораздо чаще, чем писать.
как расставить индексы
Нужно изучать конкретное приложение. Универсального ничего сказать нельзя.
Что вообще делать с большой табличкой
У mysql из коробки есть поддержка партицирования. Некоторые ограничения есть по использованию, например не поддерживаются foreign keys. Как правило, почти все запросы от приложения к большим табличкам имеют под собой какой-то общий фильтр. Например, 90% запросов хотят данные только за последний месяц, или почти всегда привязаны к id пользователя. Возможно, данные в вашей табличке можно порезать на партиции.

С чем ассоциировать .desktop файл, чтобы он просто запускался?

Допустим, у меня по умолчанию в качестве текстого редактора используется Geany. Если я в терминале наберу xdg-open something.desktop, то файл откроется в Geany, но мне нужно чтобы он запускался!
На скриншоте вы видите, что в контекстном меню предлагают открыть ярлык офисом, т.е. связанным приложением и это очень неудобно! Я не хочу открывать его офисом, я хочу чтоб в этом меню предлагался текстовый редактор, но текстовый редактор уже является приложением по умолчанию и по этому его там нет.
Мне нужно как-то перенести Geany из разряда "Приложение по умолчанию" в разряд "Связанные приложения", а приложением по умолчанию назначить команду запуска. Подскажите пожалуйста, как это сделать?


Ответ

ответ будет (в последней части) пересекаться с другим моим ответом: Каким образом программно зарегистрировать в ОС программу для открытия определенного типа файлов по умолчанию?, но уже не в общесистемном, а в пользовательском контексте.
для начала надо уметь извлечь из desktop-файла имя программы (оно указывается в строке, начинающейся с exec=):
с помощью такого скрипта:
#!/bin/bash f=$1 shift $(sed -n '/^Exec=/{s/^Exec=//;s/%.//;p}' $f) "$@" & или такого
#!/usr/bin/python from gi.repository import Gio import sys def main(myname, desktop, *uris): launcher = Gio.DesktopAppInfo.new_from_filename(desktop) launcher.launch_uris(uris, None) if __name__ == "__main__": main(*sys.argv)
сохраните его под произвольным именем (например, deskopen) в каком-нибудь из каталогов, перечисленных в переменной окружения $PATH (например, в /usr/local/bin) и присвойте биты исполнимости ($ chmod +x /путь/к/файлу).
теперь desktop-файлы можно «запускать» с помощью этого скрипта:
$ deskopen /путь/к/файлу.с.суффиксом.desktop теперь надо создать desktop-файл, служащий «обёрткой» для вызова этого скрипта:
[Desktop Entry] Name=deskopen Exec=deskopen %U MimeType=application/x-desktop Terminal=false Type=Application
для использования только текущим пользователем его надо поместить под именем deskopen.desktop в каталог ~/.local/share/applications в том же каталоге (~/.local/share/applications) эту ассоциацию — между mime-типом application/x-desktop и созданной на предыдущем шаге «обёрткой» надо сделать «умолчальной». в один из файлов — defaults.list или mimeapps.list — добавьте в секцию [Default Applications] строку:
application/x-desktop=deskopen.desktop
если ни одного из этих двух файлов не существовало — создайте любой из них. тогда он будет выглядеть так:
[Default Applications] application/x-desktop=deskopen.desktop
всё. теперь команда
$ xdg-open /путь/к/файлу.с.суффиксом.desktop
будет запускать упомянутую в этом файле программу, а не редактор для редактирования этого файла.
соответственно, и «файловые менеджеры» будут вести себя аналогично при «щелчке» по такому файлу.

В чём отличие Sliding Menu от Navigation Drawer?

Насколько я понимаю, и то, и другое - выплывающее, как правило, с левой стороны боковое меню. В чём тогда отличие этих терминов?


Ответ

Sliding Menu - сдвигает основной контент, находится на одной позиции по Z оси Navigation Drawer - перекрывает основной контент, находится выше по Z оси

Почему так много строк кода в исходниках библиотек?

Заглянул в класс String в Java и был поражен количеством строк в одном файле - 3169. И так во многих библиотечных классах. Более того, во многих других языках, например, в Python исходные файлы тоже огромные. В любой компьютерной литературе рекомендуется делать небольшие файлы с четким разграничением. Почему так получается, что библиотечные модули часто нарушают это правило ?


Ответ

Код, о котором в говорите, используется миллионами человек, а потому к нему применяются очень (вот прям очень-преочень) жёсткие требования по надёжности и производительности. По сути он должен быть идеальным (или очень близким к идеалу). Скорость, надёжность и компактность алгоритма встречаются вместе нечасто, и если уж чем-то здесь и жертвовать, то это размерами исходников классов. Даже если какой-то метод сам по себе короток, несколько "лишних" строк могут добавить проверки его входных аргументов и каких-либо условий с выбросом исключений, если таковые не были пройдены. К тому же, как верно заметили в комментариях, очень значительную часть файла могут занимать комментарии.
Кроме того, код подобных библиотек, как правило, очень высокого качества, в том числе и обладающий хорошей читаемостью, что существенно сглаживает проблемы с его пониманием и восприятием.
В любой компьютерной литературе рекомендуется делать небольшие файлы с четким разграничением. Почему так получается, что библиотечные модули часто нарушают это правило ?
потому что это код "не такой как все" ввиду всё тех же повышенных требований к нему. Кроме того, классы бизнес-логики "более обычного" кода выполняют куда как меньше задач, чем, скажем, класс String из Java, а потому и не нуждаются в собственном переусложнении. Для подавляющего большинства "обычного" кода эти требования (а точнее рекомендации) будут вполне справедливыми - вы сами себя возненавидите, если сначала напишете манускрипт в 10 000 строк кода, а потом, спустя полгода, будете вынуждены искать в нём затаившийся баг.

Какой формат дат лучше подходит для API?

Необходимо в формате json отправлять/получать даты по API. Как обрабатывать и хранить временные зоны?
Заметил, что даты из NSString в NSDateс временными зонами автоматически конвертируются в UTC.
// date with time zone NSString *dateString = @"2016-11-08T07:00:00.000+11:00"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ";
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"CDT"]; NSLog(@"1. CDT date = %@", [dateFormatter dateFromString:dateString]);
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; NSLog(@"2. UTC date = %@", [dateFormatter dateFromString:dateString]);
dateFormatter.timeZone = [NSTimeZone systemTimeZone]; NSLog(@"3. system date = %@", [dateFormatter dateFromString:dateString]);
// date without time zone dateString = @"2016-11-08"; dateFormatter.dateFormat = @"yyyy-MM-dd";
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"CDT"]; NSLog(@"4. CDT date = %@", [dateFormatter dateFromString:dateString]);
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; NSLog(@"5. UTC date = %@", [dateFormatter dateFromString:dateString]);
dateFormatter.timeZone = [NSTimeZone systemTimeZone]; NSLog(@"6. system date = %@", [dateFormatter dateFromString:dateString]);
Лог:
1. CDT date = 2016-11-07 20:00:00 +0000 2. UTC date = 2016-11-07 20:00:00 +0000 3. system date = 2016-11-07 20:00:00 +0000 4. CDT date = 2016-11-08 06:00:00 +0000 5. UTC date = 2016-11-08 00:00:00 +0000 6. system date = 2016-11-07 21:00:00 +0000
Это значит, что для корректной обработки даты надо по строке определять временную зону и рядом с датой NSDate хранить временную зону NSTimeZone?
NSString *dateString = @"2016-11-08T07:00:00.000+03:00"; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ";
NSDateFormatter *dateFormatterForPrint = [[NSDateFormatter alloc] init]; dateFormatterForPrint.timeZone = [self timeZoneFromDateString:dateString]; dateFormatterForPrint.dateFormat = @"dd.MM.yyyy HH:mm:ss";
NSDate *date = [dateFormatter dateFromString:dateString]; NSLog(@"date is: %@", [dateFormatterForPrint stringFromDate:date]);
Лог:
date is: 08.11.2016 07:00:00


Ответ

Я пользуюсь тремя правилами:
внутреннее представление NSDate - всегда UTC. При взаимодействии с сервером надо использовать UTC и не заморачиваться с ритуальными танцами При отображении или парсинге времени, введенного на стороне клиента надо испльзовать NSDateFormatter с текущей локалью. IOS/Mac OS разберется, какое в данный момент время установлено на конкретном клиенте. Можно завдвать/использовать любой формат, но предполагается, что юзер всегда использует текущее местное время.
Ближайшая аналогия - таблица авиарейсов. Сами самолеты летают по UTC, но для пассажиров и время отлета, и время прилета всегда указываются в местном времени.

C# надежное логирование

Как организовать надежную запись при логировании? Иногда возникает ошибка:
System.IO.IOException: The process cannot access the file '..\Log\log.txt' because it is being used by another process.
Запись в файл происходит каждую секунду. Вот мой метод:
private static void WriteInFile(string fullpath, string message) { using (StreamWriter sw = new StreamWriter(fullpath, true)) { sw.WriteLine(DateTime.Now.ToString() + " " + message); } }
PS Не нужно предлагать готовые библиотеки для логирования.


Ответ

Воспользуйтесь библиотекой NLog, она позволяет включать и отключать защиту файла при записи, и держать ли файл "открытым", очень удобная и гибкая библиотека
private static readonly Logger Log = LogManager.GetCurrentClassLogger(); ... Log.Info("Log"); Log.Error("Log"); Log.Debug("Log");
Также позволяет записывать Info, Error, Debug и т.д. в разные файлы, есть возможность даже писать в БД

Как добавить DevExpress в проект

Мне нужно использовать
using DevExpress.Data.Filtering; using DevExpress.Xpf.Grid;
как добавить это в проект? Через Nugget? Как понять что именно из списка в Nugget мне надо, или гуглить dll?


Ответ

Ну вообще вам нужно установить DevExpress, при установки dll пропишутся в GAC, а потом вы уже добавите нужные вам непосредсвенно в проекте. триальная версия.

Получение типа из подкласса. Полиморфизм C#

Доброго времени суток, столкнулся с такой проблемой. Есть абстрактный класс ViewModel, который содержит логику добавления данных в коллекцию для отображения в GUI.
public abstract class ViewModel {
public ObservableCollection Data { get; set; } protected abstract IModel createObject(SqlDataReader reader);
protected void selectData(string query) { // ... // Логика получения reader // ... IModel item = this.createObject(reader); this.Data.Add(item); } }
Также есть классы моделек, все они реализую интерфейс IModel, код приводить не буду, в нем нет необходимости. Класс реализующий ViewModel выглядит так:
public class UsersViewModel : ViewModel {
public UsersViewModel() { string query = "SELECT TOP 300 * FROM users ORDER BY reputation DESC"; this.selectData(query); }
protected override IModel createObject(SqlDataReader reader) { return new User(reader); } }
Проблема собственно в методе createObject. Во всех подклассах он делает одну единственную вещь: возвращает экземпляр класса модели. Мне бы хотелось от него избавится. И сделать так, что бы в абстрактном классе ViewModel метод selectData сам создавал тот объект модели, какой нужно, а какой именно, он бы узнавал из подкласса. Метод должен выглядеть примерно так:
protected void selectData(string query) { // Логика получения reader IModel item = new Тип_Модели_из_подкласса(reader); this.Data.Add(item); }
Кажется мне, что проблему можно решить с помощью обобщений, но не знаю как. Или создать в подклассе свойство, которое будет уточнять какую именно реализацию интерфейса IModel нужно использовать. Как мне это реализовать? Заранее спасибо.


Ответ

Ну например, один из методов такой:
public abstract class ViewModelImpl : ViewModel where T : IModel { protected void selectData(string query) { // Логика получения reader IModel item = (T)Activator.CreateInstance(typeof(T), reader); this.Data.Add(item); } }
Ну и наследуйте конкретные классы от ViewModelImpl с нужным типом T
(Если бы конструктор T был без параметров, можно было бы обойтись без рефлексии.)

Для лучшей читаемости можно вынести метод:
private T CreateModelItem(SqlDataReader reader) { return (T)Activator.CreateInstance(typeof(T), reader); }
protected void selectData(string query) { // Логика получения reader IModel item = CreateModelItem(reader); this.Data.Add(item); }
Впрочем, у вас этот вспомогательный метод уже есть, он называется createObject

Достать последнюю модель по дате создания Django

Подскажите как сделать запрос через Model.objects.get() либо через Model.objects.filter(), чтобы получить последнюю созданную модель. Есть поле
create_date = models.DateField( 'Создан', auto_now_add=True )


Ответ

В модели в мете можно определить полe get_latest_by
get_latest_by = "create_date"
Тогда запрос
Model.objects.latest()
выдаст вам последнюю модель, отсортированную по полю create_date, а запрос
Model.objects.earliest()
выдаст первую созданную модель.

Проблема с Transitions

Нужно реализовать вот такой эффект.

Но мне нужно не совсем так:
Верхняя часть 40%, нижняя - 60% высоты экрана. Между этими Layout находится FAB. При нажатии на него он перемещается в центр нижней части экрана, затем из центра появляется эффект ripple с помощью createCircularReveal(). И я начал делать
XML













scene1

android:clickable="true" android:onClick="startfab" app:elevation="0dp" app:backgroundTint="#d45d1e" android:src="@drawable/play" />

scene2



JAVA
public class FABScene extends AppCompatActivity { private LinearLayout shape; private Scene scene1, scene2;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.fabscene); Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); shape = (LinearLayout)findViewById(R.id.viewMed); shape.setVisibility(View.INVISIBLE); setSupportActionBar(toolbar); setTitle(getIntent().getStringExtra("title")); ViewGroup sceneRoot = (ViewGroup) findViewById(R.id.scene_root); scene1 = Scene.getSceneForLayout(sceneRoot, R.layout.scene1, this); scene2 = Scene.getSceneForLayout(sceneRoot, R.layout.scene2, this);
}
public void end(View v){ Animator animator = ViewAnimationUtils.createCircularReveal(shape,shape.getWidth()/2,shape.getHeight()/2,(float) Math.hypot(shape.getWidth(), shape.getHeight()),0); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(1400); animator.addListener(new AnimatorListenerAdapter(){ @Override public void onAnimationEnd(Animator a){ shape.setVisibility(View.INVISIBLE); TransitionSet set = new TransitionSet(); set.addTransition(new ChangeBounds()); set.setDuration(3000); set.setInterpolator(new AccelerateInterpolator()); TransitionManager.go(scene1, set);
} }); animator.start(); }
public void startfab(View v){ TransitionSet set = new TransitionSet(); set.addTransition(new ChangeBounds()); set.setDuration(3000); set.setInterpolator(new AccelerateInterpolator()); set.addListener(new Transition.TransitionListener(){
@Override public void onTransitionStart(Transition p1) { } @Override public void onTransitionEnd(Transition p1) { Animator animator = ViewAnimationUtils.createCircularReveal(shape,shape.getWidth()/2,shape.getHeight()/2,0,(float) Math.hypot(shape.getWidth(), shape.getHeight())); shape.setVisibility(View.VISIBLE); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(1400); animator.start(); }
@Override public void onTransitionCancel(Transition p1) { // TODO: Implement this method }
@Override public void onTransitionPause(Transition p1) { // TODO: Implement this method }
@Override public void onTransitionResume(Transition p1) { // TODO: Implement this method }
}); TransitionManager.go(scene2, set);
} }
Не получается сделать, чтобы FAB была между двумя layout и перемещался на вторую сцену. Если поменять атрибуты высоты и ширины у FrameLayout (в котором первая сцена) на match_parent, то анимации происходят, но FAB находится в верхнем левом углу экрана. Что делать?


Ответ

Для того чтобы FloatingActionButton прикрепить к другой вью, надо использовать CoordinatorLayout и аттрибут app:layout_anchor. Как-то так:







Но, видимо, в этом случае сценой должен быть весь CoordinatorLayout.

JavaScritpt: разница в методах задания строчных переменных

Имеют ли какие-нибудь технические различия следующие два метода задания строчных переменных в JavaScrpit?
// 1 var s1= "JavaScript"; // 2 var s2 = new String("JavaScript");


Ответ

Начать можно с MDN
Различие между примитивами строк и объектами строк Важно: в Javascript присутствуют различия между объектами строк и примитивами (Это верно и для Boolean, и Number) Литералы строк (обозначаяются двойными или одинарными кавычками) и строки возвращенный вызвом String в не-конструкторском контексте (т.е. без ключевого слова new) - примитивы строк. Javascript автоматически конвертирует примитивы в объекты String, поэтому возможно использовать методы объекта String для примитивов строк. В ситуациях, когда для примитива строки нужно вызвать метод или найти свойство, Javascript автоматически обернет примитив в объект и вызовет нужный метод или свойство.
var s_prim = 'foo'; var s_obj = new String(s_prim); console.log(typeof s_prim); // Logs "string" console.log(typeof s_obj); // Logs "object"
Примитивы строк и объекты строк, имеют различие при использовании eval(). Примитивы переданные в eval будут обработаны как исходный код; Объекты строк будут обработаны как и все другие объекты, возвращением самого себя, например:
var s1 = '2 + 2'; // creates a string primitive var s2 = new String('2 + 2'); // creates a String object console.log(eval(s1)); // returns the number 4 console.log(eval(s2), s2 === eval(s2)); // returns the string "2 + 2"
Поэтому код может сломаться, если получит на вход объект String, вместо ожидаемого примитива строка, однако, обычно не нужно беспокоиться о различиях.
у строки-объекта всегда можно получить соответствующий ей примитив, с помощью вызова метода valueOf
Кроме того: литералы неизменяемы, поэтому, в отличие от объектов им нельзя добавить новых свойств, а так же их сравнение происходит как сравнение объектов
var primitive_s = '123'; var primitive_s2 = '123' var s1 = new String('123'); var s2 = new String('123'); primitive_s.prop = 10; console.log('primitive_s.prop', primitive_s.prop); s1.prop = 10; console.log('s1.prop', s1.prop); console.log(primitive_s == primitive_s2, primitive_s === primitive_s2); console.log(s1 == s2, s1 === s2); // но! console.log(primitive_s == s1, primitive_s === s2);
примеры на основе ответов: первый, второй

С точки зрения спецификации
При получении значения свойства, в случае примитивного объекта вызывается абстрактная функция ToObject. У результата вызывается нужное свойство с нужным this.

С точки зрения реализации.
Спецификация никак не ограничивает как должны быть реализованы примитивы и объекты. А так же не регламентирует наличие/отсутствие свойств у примитивов.
Например, для V8
Строковые примитивы разбираются в объект класса v8::String. Следовательно методы могут быть вызваны напрямую у этого объекта.
Строки-объекты, в свою очередь, разбираются в объекты класса v8::StringObject, который расширяет класс Object и будучи полноценным объектом служит оболочкой для v8::String
этот пункт частичный перевод ответа на английский вопрос

вывод последнего депозита для каждого аккаунта


дальше у нас есть такой запрос
SELECT distinct last_value(account) over(partition by account order by data desc) account, last_value(sum) over(partition by account order by data desc) sum FROM ( select account, data, sum, nth_value(data, 1) over(partition by account order by data desc) cr from accounts)x WHERE data = cr;
Выдает он последний депозит для каждого аккаунта. Как можно переписать программу, используя только одну оконную функцию?


Ответ

Можно попробовать вот так:
select account, data, sum from ( select a.*, row_number() over(partition by account order by data desc) as rn from accounts a ) where rn = 1;
Еще варианты:
RANK/DENSE_RANK
select account, sum from ( select a.*, rank() over(partition by account order by data desc, sum) as rn from accounts a ) where rn = 1; (использование dense_rank такое же),
NTH_VALUE
select account, sum from ( select a.*, nth_value(sum, 2) over(partition by account order by data desc, sum desc) as rn from accounts a ) where rn is null;
LAG
select account, sum from ( select a.*, lag(data) over(partition by account order by data desc, sum desc) as rn from accounts a ) where rn is null;
Ну и так далее...

отобразить любой текст при выборе пункта в listview c#

Когда нажал на пункт в listbox, то показывается текст в textbox1, например, нажал на пункт 12 (listbox.item.add("12")); и в textbox появился текст textbox1.text="asdasdasd" если нажал на другой пункт то появилось другой текст в textbox1 не знаю как сделать..


Ответ

У компонента ListBox есть событие SelectedIndexChanged, в обработчике которого можно реализовать нужную вам логику. Например, так:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { //Объявляем переменную lb и приводим компонент, вызвавший событие к типу ListBox //(у нас же событие сгененрировал ListBox1, верно? А он имеет тип ListBox. var lb = sender as ListBox; //В наж текст-бокс пишем номер выбранного пункта, здесь lb.SelectedIndex + 1 так как //нумерация с нуля. textBox1.Text = "Выбран пункт №" + (lb.SelectedIndex + 1).ToString(); }
или так:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { //Получим номер выбранного пункта: int i = (sender as ListBox).SelectedIndex + 1; //В зависимости от номера делаем какие-то РАЗНЫЕ действия: switch (i) { case 1: textBox1.Text = "Выбран первый пункт списка"; break; case 2: textBox1.Text = "Тра-ля-ля"; break; case 3: textBox1.Text = "Тру-ля-ля"; break; case 4: case 5: textBox1.Text = "Выбран 4 или 5 пункт, лениво уточнять..."; break; default: textBox1.Text = "Я таких цифр не знаю!"; break; }
}
UPDATE:
Можно для привязки объявить и заполнить массив связанных с каждым пунктом значений. В примере я объявляю строковый массив (хотя он может быть любого типа) из 5 пунктов, и, в зависимости от индекса выбранного пункта в ListBox, вывожу соответствующий этому индексу элемент массива. Если у вас в ListBox будет 100 пунктов, то и массив должен быть не менее чем из 100 пунктов. Но на всякий случай делаю проверку индекса:
public string[] textData = new string[5] { "qwe", "rty", "uio", "p[]", "asd" };
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { //Получим индекс выбранного пункта: int i = (sender as ListBox).SelectedIndex; //Проверяем, не вышли ли мы за границы масива? if (i > textData.GetLength(0)-1) { textBox1.Text = "С этим пунктом ничего не связано!"; return; } textBox1.Text = textData[i]; }

Ассерт для CRTP

Использую CRTP. В коде это выглядит так:
template class Base{ //... }; class Derived : public Base{ //... };
Начали появляться copy/paste ошибки:
class Foo : public Base{ //... }; class Bar : public Base{ //Ой //... };
Решил написать ассерт, который бы это дело проверял.
Придумал такой вариант:
template class Base{ protected: typedef T TemplateType; typedef Base BaseType; //... }; class Derived : public Base{ public: Derived(){ Q_ASSERT(typeid(*this) == typeid(Base::TemplateType)); } //... };
Но какой-то он неказистый. Работает на этапе выполнения, требует наличия каких-то непонятных тайпдефов.
И вот я здесь. Как написать такой ассерт используя C++03 и Qt? И чтобы его при этом было не стыдно людям показать.


Ответ

Такой вариант:
template class IsDerivedFrom { class No {}; class Yes { No no[2]; }; static Yes Test(B*); static No Test(...); public: enum { Is = sizeof(Test(static_cast(0)))==sizeof(Yes) }; };
template class Base { };
class D1: public Base { public: D1(){ cout << IsDerivedFrom >::Is << endl; } };
class D2: public Base { public: D2() { cout << IsDerivedFrom >::Is << endl; } };
int main() { D1 d1; D2 d2; }
Ну, понятно, что можно использовать IsDerivedFrom >::Is прямо во время компиляции.
Условие C++03 выполнено - Open Watcom успешно справился с компиляцией.
Update Решение 2. Не даст скомпилировать наследника от другого Base<>, copy-paste отработает - имени текущего класса в нем нет :). Увы, один typedef все же потребовался.
template class Base { typedef T base; };
template class IsDerivedFromBase { static void Constraints(T*p) { Base*b = p; } public: IsDerivedFromBase() { void(*p)(T*) = Constraints; } };
class D1: public Base { public: D1(){ IsDerivedFromBaseid; } };
class D2: public Base { public: D2() { IsDerivedFromBaseid; } };
int main() { D1 d1; D2 d2; }
Update 2 Пробуйте теперь:
template class IsSame { public: enum { value = 0 }; };
template class IsSame { public: enum { value = 1 }; };
template class Base { typedef T base; };
template class IsDerivedFromBaseThis { static void Constraints(T*p) { Base*b = p; } public: template IsDerivedFromBaseThis(U*) { int x[IsSame::value]; void(*p)(T*) = Constraints; } };
class D1: public Base { public: D1(){ IsDerivedFromBaseThisid(this); } };
class D2: public Base { public: D2() { IsDerivedFromBaseThisid(this); } };
int main() { D1 d1; D2 d2; }

Как связать чек бокс со строкой напротив которой он находится

Доброго времени суток! Есть таблица и есть проблема, не могу сообразить как связать чек бокс со строкой напротив которой он находится.Как сделать так чтобы при клике на чек бокс выбиралась эта строка а при нажатии на редактировать, выводилась бы для редактирования
Есть код таблицы:
# Фио клиента Дата Время where ('id', $res['dentist_id']); ?> 1


Ответ

Я бы посоветовал сделать следующее:
Для начала дайте атрибуты value с id записи и класс к примеру checkbox для удобства, но это не обязательно, в своем коде для примера я буду использовать его как селектор. Тегу тоже можете дать класс selected для визуального показа что блок выделен, но это не обязательно. Кнопке Редактировать дайте класс edit-btn или любой другой, но тогда измените JS. И самое главное это JavaScript:
$(function () { //Эта функция отвечает за то, что при клике на чек давать tr class selected или убирать $('table').on('click', '.checkbox', function() { $(this).closest('tr').toggleClass('selected'); });
//Когда вы выбрали чек и нажмете редактировать то будет редирект на странице редактирования $(document).on('click', '.edit-btn', function() { var $checkbox = $('table').find('.checkbox:checked:first'); if ($checkbox.length) { var id = $checkbox.val(); alert('Сейчас будет редирект на редактирование записи с ID:' + id); window.location.replace('/update/' + id); } else { alert('Не выбрана колонка для редактирования'); } }); });
Но есть один недочет, скрипт перед первую колонку где установлен чекбок, если выбирать будете несколько то тут надо или убирать с остальных и оставлять только на одном, или выдавать предупреждение, хотя это не очень, или оставьте как есть.

Null Pointer Exception Аннотация @Autowired Spring

Никак не могу разобраться с тем, как работает аннотация @Autowired в Spring. Итак, допустим, у меня есть вот такой интерфейс Interface1:
public interface Interface1 { String getString(); }
У него есть всего один метод. Следующий класс, являющийся @Service, реализует этот простой интерфейс:
@Service public class Interface1Impl implements Interface1 { public String getString() { return "Hello!"; } }
Теперь я хочу использовать где-то экземпляр этого класса вместе с аннотацией @Autowired. Создаю вот такой вот класс Instance1:
@Service public class Instance1 {
@Autowired Interface1 field;
public void doSomething() { System.out.println(field.getString()); } }
Далее в методе main своего главного класса я делаю следующее:
public class MainClass { public static void main(String[] args) { Instance1 instance = new Instance1(); instance.doSomething(); } }
Однако появляется NullPointerException из-за того, что field с аннотацией @Autowired остался без присвоенного значения. Я не понимаю, почему так, и в целом плохо понимаю, как в данной ситуации работает Spring. Пожалуйста, объясните мне, как можно исправить код, чтобы в методе main я смог вызывать методы instance.


Ответ

"Магия" аннотаций Spring работает только внутри контекста Spring. Который вам нужно создать. Вот некоторое приближение того, что вы пытаетесь сделать в main
@Configuration @ComponentScan(basePackages = "your.package") public class MainClass { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(MainClass.class); Instance1 inst = ctx.getBean(Instance1.class); inst.doSomething(); } }
Но в Spring-приложениях впринципе не принято делать никакую логику в main, кроме какой-то базовой инициализации самого Spring, т.к. этот код лежит за пределами контекста приложения.

Добавить namespace'ы в XML-блоки

Здравствуйте! Имеется следующий тэмплэйт:
randomInfo randomInfo randomInfo randomInfo randomInfo randomInfo
Как, используя T-SQL превратить его в:
randomInfo randomInfo randomInfo randomInfo randomInfo randomInfo
PersonalProgramList - корень, PersonalProgram - неограниченное кол-во.


Ответ

Простой способ заменить namespace элемента (средствами XQuery) мне неизвестен.
Если бы исходная схема XML была именно такая как в вопросе (внутри PersonalProgram могут быть только One и Two с каким-то текстом внутри), то можно было бы честно пересобрать исходный XML в нужном формате с помощью FLWOR
declare @xml xml = N'...';
select @xml.query(N' { for $pp in /PersonalProgramList/PersonalProgram return { for $a in $pp/* return if (local-name($a) = "One") then {$a/text()} else {$a/text()} } } ');
Если же внутри PersonalProgram может быть что угодно, то можно так же с помощью FLWOR пересобрать XML, указав нужный namespace для PersonalProgram, и скопировав всё что внутри. Однако при замене namespace для PersonalProgram у всего что внутри явно укажется xmlns="", который кроме как с помощью REPLACE я не вижу варианта убрать (поэтому мне этот способ не очень нравится):
select cast(replace(cast(@xml.query(N' { for $pp in /PersonalProgramList/PersonalProgram return { $pp/* } } ') as nvarchar(max)), N'xmlns=""', N'') as xml);