Страницы

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

понедельник, 28 января 2019 г.

Аннотация, которая не дает собрать release

Я встречал упоминание какой-то метки, возможно, аннотации, которая не дает собрать release. Используется для того, чтобы не забыть исправить нужные места в коде.
Подскажите, что это и как включить?


Ответ

Настройте Android Studio падать при сборке, если код содержит //STOPSHIP. Чтобы включить в lint проверку на //STOPSHIP, добавьте в ваш build.gradle
android { ... lintOptions { abortOnError true fatal 'StopShip' } }
Если у вас есть //STOPSHIP комментарий в коде, релизная сборка не соберётся. Кроме этого, вы также можете включить в Android Studio подсветку таких комментариев (по умолчанию выключено). Preferences → Editor → Code Style → Inspections. Ищите в поиске STOPSHIP и устанавливайте флажок для подсветки.
Источник: https://habrahabr.ru/post/319562/

Переименовать заголовок окна

Возможно ли силами C# отловить заголовок окна стороннего ПО и переименовать его на время сессии. Например найти процесс calculator.exe отловить заголовок "Калькулятор" и переименовать его в "Тест"?


Ответ

Сначала находим окно и его значение hWnd по названию(отсюда)
IntPtr hWnd = IntPtr.Zero; foreach (Process pList in Process.GetProcesses()) { if (pList.MainWindowTitle.Contains(wName)) { hWnd = pList.MainWindowHandle; } } return hWnd; //Should contain the handle but may be zero if the title doesn't match
Затем устанавливаем значение окна (отсюда)
[DllImport("user32.dll")] static extern bool SetWindowText(IntPtr hWnd, string text);

Зачем нужен 4 конструктор std::bitset, когда есть 3?

Класс std::bitset имеет несколько конструкторов. Один из них (3) имеет вид:
template< class CharT, class Traits, class Alloc > explicit bitset( const std::basic_string& str, typename std::basic_string::size_type pos = 0, typename std::basic_string::size_type n = std::basic_string::npos, CharT zero = CharT('0'), CharT one = CharT('1'));
Другой (4):
template< class CharT > explicit bitset( const CharT* str, typename std::basic_string::size_type n = std::basic_string::npos, CharT zero = CharT('0'), CharT one = CharT('1'));
Зачем нужен конструктор (4), когда есть (3)?
И в частности, зачем использовать CharT* вместо std::basic_string?


Ответ

Я думаю, что это связано с включенной новой возможностью в стандарт C++ в качестве аргумента использовать список инициализации в фигурных скобках.
Дело в том, что все конструкторы класса объявлены со спецификатором функции explicit, чтобы предотвратить неявное преобразование объектов других типов в объекты класса.
В этом случае если вы вызовите конструктор класса с аргументом в фигурных скобках с одним типом, то не будет преобразования объектов списка инициализации в другой тип.
Сравните эти две демонстрационные программы
#include #include
struct A { explicit A( const std::string & ) {} };
int main() { A a( "HEllo" );
return 0; }
Данная программа будет успешно компилироваться. Аргумент конструктора из типа литерала преобразуется в тип объекта класса std::string
Теперь заключите аргумент вызова конструктора в фигурные скобки
#include #include
struct A { explicit A( const std::string & ) {} };
int main() { A a( { "HEllo" } );
return 0; }
Данная программа уже не будет компилироваться.
Поэтому если вы включите еще один конструктор со спецификатором explicit, то программа уже будет компилироваться
#include #include
struct A { explicit A( const std::string & ) {} explicit A( const char * ) {} };
int main() { A a( { "HEllo" } );
return 0; }

Компилятор javac - статический компилятор?

Цитата из книги "Java. Новое поколение разработки":
"В техническом отношении с точки зрения теории компиляции байт-код — это действительно своеобразный промежуточный язык (intermediate language), а не настоящий машинный код. Это означает, что процесс преобразования исходного кода Java в байт-код не является компиляцией в том смысле, в каком она понимается в языках C и С++. В свою очередь, javac не назовешь таким же компилятором, как gcc. В сущности, это генератор файлов классов для обработки исходного кода Java. Настоящим компилятором в экосистеме Java является динамический компилятор (JIT)".
Правильно ли я понимаю, что, в то время как JIT - динамический компилятор, javac - статический компилятор?


Ответ

Javac не является статическим компилятором. Потому, что он генерирует байт код, который уже в процессе выполнения программы будет динамически компилироваться в машинный код, или интерпретироваться
Но в java 9 появится возможность генерировать машинный код до запуска программы.

3D зеркальное отображение карт

Я пытаюсь сделать эффект зеркального отображения 3D-карты с помощью CSS, как на примере ниже.

Разница заключается в том, что я хочу использовать чистый CSS для реализации эффекта.
Ниже мой код:
/*** LESS: ***/ .card-container { position: relative; height: 12rem; width: 9rem; perspective: 30rem; .card { position: absolute; width: 100%; height: 100%; div { position: absolute; height: 100%; width: 100%; } .front { background-color: #66ccff; } .back { background-color: #dd8800; backface-visibility: hidden; transition: transform 1s; &:hover { transform: rotateY(180deg); } } } }

Front
Back

После попыток, в течение нескольких часов, я смог получить только следующий эффект:
Можно ли реализовать этот эффект card flip, используя только CSS?
комментарии:
"front" не получает анимации. Установите его вращение на 180, 360 при наведении на него. Положение 360 градусов должно быть похоже на 0, но при этом должно поддерживаться то же направление вращения. - @Yemachu
источник: 3D flipping card


Ответ

Я упростил код, чтобы сделать его короче. Было несколько вопросов, и ниже, на рисунке, как они выглядят:

передняя поверхность не поворачивается при наведении курсора мыши hover эффект запуcкается, при наведение курсора на .back div . Это может создать мерцание, а затем div вращается. Это лучше, чтобы запустить анимацию, иначе родитель зависнет. первый родитель не очень полезен, так что я убрал его.
Ниже приведен пример простого эффекта CSS, только flipping card флип анимация запускается при наведении курсора мыши:
.card { position: relative; width: 9rem; height: 12rem; perspective: 30rem; } .front, .back { position: absolute; width: 100%; height: 100%; transition: transform 1s; backface-visibility:hidden; } .front { background-color: #66ccff; } .back { background-color: #dd8800; transform: rotateY(180deg); } .card:hover .front{ transform: rotateY(180deg); } .card:hover .back { transform: rotateY(360deg); }

Front
Back

Ответил: web-tiki

Перегрузка оператора + для сложения своего объекта и чисел

Хочу осуществить возможность перегрузить оператор +, таким способом, что бы возможно было к объекту добавлять объект, и к объекту добавлять число.
class Fff: def __init__(self,x,y): self.x = x self.y = y def __add__(self,obj): return Fff(self.x + obj.x,self.y + obj.y) def __add__(self,v): return Fff(self.x + v,self.y + v) def show(self): print self.x,' : ',self.y
f1 = Fff(1,2) f2 = Fff(5,5)
result = f1 + f2 result2 = f1 + 2
result.show() result2.show()


Ответ

Перегрузки функций в питоне нету. Но вы можете реализовать различное поведение функции в зависимости от типа переданного аргумента. Используйте нечто подобное вместо обеих ваших методов сложения.
def __add__(self, arg): if isinstance(arg, numbers.Number): return Fff(self.x + arg, self.y + arg) else: return Fff(self.x + arg.x, self.y + arg.y)

Организация таска компиляции sass в Gulp

Какие следует использовать плагины Gulp для более грамотной, с точки зрения эргономики ресурсов, уменьшения времени выполнения компиляции для организации таска.
Структура проекта следующая:
dev |--component1 // компоненты проекта |--component2 ..... |--scss |--base // базовые подключаемые файлы с миксинами и прочим |--elements // общие для всех страниц элементы оформления (кнопки и т.д.) |--componets |--component1 |--style.scss |--component2 ........ |--main.scss
Собирается все это так:
app |--component1 // компоненты |--css // отдельные стили каждого компонента |--style.css |--component2 ..... |--css // главный css |--style.css
Таск sass для всего этого добра:
gulp.task('sass', function() { return combiner( gulp.src([ 'dev/scss/main.scss' , 'dev/scss/project components/**/*.scss' ]), debug({title: 'src'}), gulpIf(isDevelop, sourcemaps.init()), sass( sassOptions ), autoprefixer({ browsers: ['last 4 versions'] }), gulpIf(isDevelop, sourcemaps.write()), rename(function (path) { path.dirname += '/css'; path.basename = 'main' ? 'style' : path.basename; }), gulpIf(!isDevelop, cleanCSS()), gulp.dest('app'), debug({title: 'dest'}) ).on('error', notify.onError(function(err){ return { title: 'sass', message: err.message } }))
});
Сейчас при выполнении задачи в папку app помещаются все файлы из папок компонентов и главный файл стилей, независимо от того модифицировались они или нет. Хотелось бы что-бы манипуляции производились только с модифицируемыми файлами + непонятен вопрос с кешированием подключаемых через @import файлов.
Так же вопрос добавления удаления файлов и переписывания урлов к файлам подключаемым через css (картинки, шрифты...)
Буду признателен за подробные ответы и советы по организации таска.


Ответ

В идеале сборка должна быть такая, чтобы скомпилированный файлы, которые будут отдаваться пользователю, лежали отдельно от исходников и их можно было спокойно удалить при необходимости. К тому же, это позволит делать дополнительные оптимизации с исходными файлами и не менять пути в сборке.
Организация стилей
В целом, вы отлично организовали сборку стилей: организовали переменные окружения, добавили афтопрефиксер. Однако я бы посоветовал создать два отдельных таска для разного окружения, чтобы исключить дополнительные условия. К тому же, можно было бы в качестве путей добавить лишь 'dev/scss/main.scss' и в нем же делать @import'ы к остальным файлам.
Также бы посоветовал добавить livereload(), чтобы при изменении файлов ваш локальный сервер автоматически подгружал все изменения.
Также не пойму, как вы бы хотели, чтобы манипуляции производились только с модифицируемыми файлами. Если вы компилируете все scss-файлы в один main.css, то операции будут производиться над всем main.css, уже после сборки. Если вы хотите, чтобы манипуляции производились лишь с тем файлом, который вы меняете, нужно каждый из этих файлов подключать к документу и не объединять при разработке.
Организация картинок
Я бы посоветовал хранить исходные картинки отдельно и переносить их при компиляции в папку сборки (назовем ее public). Кроме обычного переноса было бы хорошо эти картинки сжать:
К примеру, картинки можно легко сжать без потери качества только за счет удаление exif-данных. На реальном сайте можно сократить размер картинок в среднем на 70%, что на современном сайте равняется примерно 4 МБ. Пример на gulp
var gulp = require('gulp'), imagemin = require('gulp-imagemin'), imageminJR = require('imagemin-jpeg-recompress'), imageminSvgo = require('imagemin-svgo');
// Optimizing images gulp.task('imagemin', function() { gulp.src('./img/**/*') .pipe(imagemin([ imageminJR({ method: 'ms-ssim' }), imageminSvgo({ plugins: [ {removeViewBox: false} ] }) ])) .pipe(gulp.dest('./public/img/')) });
А для браузеров, которые понимают легковесный формат webp (формат разработан Google), можно сделать еще такой вариант изображений:
var gulp = require('gulp'), webp = require('gulp-webp');
// Generate Webp gulp.task('webp', function() { gulp.src('./img/**/*') .pipe(webp()) .pipe(gulp.dest('./public/img/')) });
Организация шрифтов
Тоже самое касается шрифтов, однако их нужно лишь перемещать в public
// Replace fonts gulp.task('fonts', function () { gulp.src('./fonts/text-font/*') .pipe(gulp.dest('./public/fonts/')) });
Создание иконочного шрифта
Предпочтительней было бы использование иконичного шрифта вместо картинок-спрайтов. И у этого метода есть ряд преимуществ:
Более меньший вес шрифта, чем спрайта; Гибкость стилизации через CSS; Меньший вес CSS; Гибкий размер и ненадобность создание версий для Retina-дисплеев.
Для генерации иконочного шрифта я бы посоветовал такую комбинацию:
// Generate icon font gulp.task('iconfont', function() { var fontName = 'icon-font', cssClass = 'i'; // Исходные SVG-файлы gulp.src(['./fonts/icon-font/*.svg']) .pipe(iconfontCss({ fontName: fontName, cssClass: cssClass, path: './styl/mixins/icon-font.styl', targetPath: '../../styl/components/font/icon-font.styl', fontPath: '../fonts/' })) .pipe(iconfont({ fontName: fontName, prependUnicode: true, normalize: true, formats: ['svg','ttf','woff','woff2'] })) .pipe(gulp.dest('./public/fonts/')); });
Миски для стилей, который берется из этой строки path: './styl/mixins/icon-font.styl' будет выглядеть так:
@font-face font-family "<%= fontName %>" src: url('<%= fontPath %><%= fontName %>.woff2') format('woff2'), url('<%= fontPath %><%= fontName %>.woff') format('woff'), url('<%= fontPath %><%= fontName %>.ttf') format('truetype'), url('<%= fontPath %><%= fontName %>.svg#<%= fontName %>') format('svg')
[class*="i-"] position relative display inline-block width 1em height 1em &:before font 14px '<%= fontName %>' font-size inherit text-rendering auto speak none font-variant normal text-transform none color inherit position absolute top 50% left 50% transform translate(-50%, -50%)
<% _.each(glyphs, function(glyph) { %> .<%= cssClass %>-<%= glyph.fileName %>:before content "\<%= glyph.codePoint %>" <% }); %>
После генерации шрифта все, что вам нужно будет сделать, это подключить сгенированный CSS к вашему сайту или инглудить его к главному CSS-файлу, а затем использовать таким образом:

Steam Trade Offer как послать запрос и получить информацию, принял ли его человек

День добрый господа. Делаю трейд бота для Steam. Задача такая - послать запрос человеку на обмен и удостовериться, что он его принял. Если можно пример на PHP/Python сделать, буду очень благодарен. Заранее спасибо!


Ответ

Для этого вам нужно будет отслеживать ваши запросы и иногда просматривать их статус. Библиотека на PHP для Steam можно найти тут. Как пример - сохраняете все запросы в файл, и затем каждые X минут делаете запрос статуса по этим запросам, обновляя их и реагируя на принятие предложения.

header('Location:') не перенаправляет

Если кратко то есть функция
static function ErrorPage404() { $host = 'http://'.$_SERVER['HTTP_HOST'].'/404'; header('HTTP/1.1 404 Not Found'); header("Status: 404 Not Found"); header('Location:'.$host.''); exit(); }
В нужный момент ее вызываю и на локальном хостинге все работает... Но при переносе срабатывают все заголовки, кроме location ... Подозреваю что дело в настройке сервера (возможно из за SSL, включен 301 редирект с http на https) но не могу докопаться...
Читал подобные проблемы, но решения так и не нашел... Вот что пробовал: Установил значение output_buffering = On,ob_start(),ob_end_flush();
Вот что выдает браузер(название сайта заменил):
Request URL:https://site.ru/avtolombard/asd Request Method:GET Status Code:404 Not Found Response Headers view source Connection:Keep-Alive Content-Encoding:gzip Content-Length:14247 Content-Type:text/html; charset=UTF-8 Date:Sat, 04 Mar 2017 19:36:07 GMT Keep-Alive:timeout=3, max=100 Location:http://site.ru/404 Server:Apache Vary:Accept-Encoding,User-Agent
В действительности оказалось, что не работает Location с заголовком 404... Спасибо @Qwertiy за совет по поводу неудобства для пользователя. По итогу добавил пару условий в маршрутизатор и выдаю контент 404-й станицы с заголовками 404, не меняя URL


Ответ

Есть такое подозрение, что заголовок location работает только с трёхсотой группой кодов. Вроде 404 надо отдавать прям страницей ошибки, а не пытаться туда упихать редирект.
В принципе можно попробовать
Refresh: 3; URL=http://site.ru/404
Но вообще, это плохая идея, портить адрес страницы. Вот перепечатывал пользователь какой-то url, опечатался в одной букве и теперь ему всё вводить заново? Вместо того, чтобы просто исправить?

Новые правила выведения шаблонного типа в c++17

Что дают новые правила выведения шаблонного типа в c++17?


Ответ

В c++17 появилась возможность опускать явное упоминание типов шаблонных параметров при объявлении переменной шаблонного типа. Например, для шаблонного типа S, конструктор которого принимает аргумент, зависимый от T
template struct S { S(const T&) {} };
можно использовать упрощённую запись, вида:
S si(42); S sl(42l); S sd(42.);
На первый взгляд кажется, что все переменные si, sl, sd имеют одинаковый тип. И если бы S не был шаблонным типом, это было бы действительно так. Но в данном случае, реальные типы переменных различны и выводятся из типа аргумента, переданного в конструктор. Эквивалентная запись для прежнего стандарта языка будет выглядеть так:
S si(42); S sl(42l); S sd(42.);
Правда, указывая явно тип в треугольных скобках, нет особого смысла использовать разные типы в аргументах, т.е. можно везде использовать целое 42
Упомянутая выше логика компилятора опирается на неявное выведение типов (Implicit Deduction Guides). Но помимо этого есть и явное (Explicit Deduction Guides). В этом случае можно указать компилятору явно использовать некоторый целевой тип при попытке выведения типа. Например, если после определения шаблона класса добавить такую строку:
S(double) -> S;
то это заставит компилятор выбирать тип int в качестве T, когда аргумент конструктора имеет тип double. Т.е. в этом случае, запись вида:
S sd(42.);
будет уже создавать переменную типа S, а не S. Объект типа S по-прежнему можно будет создать, но тип придётся указывать явно.
О правилах выведения типов можно получить дополнительную информацию в черновике стандарта:
[temp.deduct.guide] [over.match.class.deduct]

Появление блока в области видимости?

Так как не владею информацией , хотелось бы получить информацию от и до , как действовать на DIV при прокрутки в центр ?
Конкретных примеров нету , точнее то что я делал оказалось ерундой !
Не интересует готовое решение но требуется грамотное разъяснение с примером здесь Лучший ответ будет вознаграждён через 2 дня 200 балами за труды , конкурс будет объявлен
Уважаемые специалисты поясните как это работает ?
var $win = $(window); var $marker = $('#marker'); $win.scroll(function() { if ($win.scrollTop() + $win.height() >= $marker.offset().top) { $win.unbind('scroll'); // load there } });
Это взято с тостер и не работало и таких приеров из сети 11 пробовал


Ответ

В вашем примере нет html разметки, поэтому работать он не может, а работает это так:
Складываем значение прокрутки страницы $win.scrollTop() и высоту окна $win.height(), этим мы получаем положение страницы относительно нижней границы окна, так как нам нужно узнать пересек ли элемент нижнюю границу окна, чтобы узнать стал ли он виден, потом проверяем, если это значение больше, чем отступ нужного элемента от верха страницы $marker.offset().top, то значит элемент уже появился внизу окна, соответственно виден.
var $win = $(window); var $marker = $('#marker'); //отслеживаем событие прокрутки страницы $win.scroll(function() { //Складываем значение прокрутки страницы и высоту окна, этим мы получаем положение страницы относительно нижней границы окна, потом проверяем, если это значение больше, чем отступ нужного элемента от верха страницы, то значит элемент уже появился внизу окна, соответственно виден if($win.scrollTop() + $win.height() >= $marker.offset().top) { $('#message').html('виден'); //выполняем действия если элемент виден }else{ $('#message').html('не виден'); //выполняем действия если не элемент виден } }); #marker{ margin-top: 500px; width: 200px; height: 100px; background: red; } #message{ position: fixed; left: 20px; top: 20px; color: red; }


Фигура на css с заострением

Возможно ли с помощью css выполнить такую рамку:

И вот такую картинку:

С учетом того, что фон может быть не белым и не однотонным (картинка).
На странице очень много таких элементов и картинкой не хотелось бы делать. Но и нужно чтобы ie9 более-менее нормально показывал. clip-path наверное не подойдет.


Ответ

Можно использовать svg:

Как работает функция numpy.dot

Помогите разобраться с функцией numpy.dot. Как то не очень понятно описание в документации. Эта функция работает так же как описано в этой статье?
Есть следующий код:
Nj = 100 Nin = 100
Xin = np.zeros((Nin,1)) Winj = np.zeros((Nin,Nj))
WinjT = np.transpose(Winj) Uj = np.dot(WinjT,Xin)
По идее должен получиться массив Uj с числом строк Nj и 1 столбцом, но получается двумерный массив. Часть кода идущая после инициализации прощена, так как не имеет отношения к вопросу.


Ответ

произведение скаляров:
In [60]: np.dot(2, 3) Out[60]: 6
произведение 1D массивов (векторов):
In [61]: a = np.array([1, 2])
In [62]: b = np.array([10, 11])
In [63]: np.dot(a, b) Out[63]: 32
произведение 2D массивов:
In [64]: a = np.array([[1,2], [3,4]])
In [65]: b = np.array([[2,3], [4,5]])
In [66]: a Out[66]: array([[1, 2], [3, 4]])
In [67]: b Out[67]: array([[2, 3], [4, 5]])
In [68]: np.dot(a, b) Out[68]: array([[10, 13], [22, 29]])
Пояснение:
10: 1*2 + 2*4 13: 1*3 + 2*5
22: 3*2 + 4*4 29: 3*3 + 4*5

Ваш пример:
In [69]: %paste Nj = 100 Nin = 100
Xin = np.zeros((Nin,1)) Winj = np.zeros((Nin,Nj))
WinjT = np.transpose(Winj) Uj = np.dot(WinjT,Xin)
## -- End pasted text --
Получился 2D массив, состоящий из 100 строк и одного столбца:
In [70]: Uj.shape Out[70]: (100, 1)

Алгоритм разбиения дерева на компоненты связности

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


Ответ

Ясно, что для выполнения разбиения надо удалить ровно два ребра. Ясно также, что каждая компонента будет деревом. Также заранее ясно, чему будет равен суммарный вес вершин в каждом из трех поддеревьев. Пусть это будет Starget
Обозначим любую вершину дерева корнем и далее рассматриваем корневое дерево.
Будем строить наши связные компоненты путем наращивания (и объединения) множества поддеревьев снизу-вверх, от листьев к корню. Начинаем с набора стартовых поддеревьев, каждое из которых состоит из одной листовой вершины дерева. Если на каком-то этапе построения мы обнаруживаем поддерево T с суммой Starget, то существует решение, включающее поддерево T (если у задачи вообще есть решение). Все остальные варианты разбиения могут лишь "наращивать" T дополнительными вершинами, суммарный вес которых равен нулю. Будем назвать поддерево с суммой Starget завершенным Рассмотрим незавершенное поддерево T, корневая вершина которого являются сыном вершины P. Ясно, что P должно входить в одну и ту же связную компоненту, что и T. Из последнего утверждения сразу следует, что если у нас есть несколько незавершенных поддеревьев, корневые вершины которых являются сыновьями одного и того же предка P, то все они должны входить в одну и ту же связную компоненту, включающую также и P.
Отсюда автоматически следует, что решение задачи достаточно тривиально:
Начинаем с набора стартовых поддеревьев T, каждое из которых состоит из одной листовой вершины дерева. Циклически обрабатываем текущий набор поддеревьев T, пока у нас не останется ровно одно поддерево:     Если суммарный вес какого-то поддерева строго равен Starget (завершенное поддерево), то считаем его частью результата и исключаем из дальнейшего рассмотрения (исключаем из T и условно исключаем из исходного дерева).     Если в процессе такого исключения какая-то вершина исходного дерева становится листовой, то добавляем ее в T как отдельное поддерево.     Если у нас в T присутствуют все незавершенные поддеревья, чьи корни являются сыновьями некоей вершины P, то объединяем их в одно поддерево с корнем P. По завершению работы цикла 2-5 мы получим набор связных компонент, полученных на шаге 3, а также единственное оставшееся поддерево в T.     Если на шаге 3 получено ровно 2 завершенных поддерева, а вес оставшегося поддерева в T тоже равен Starget - то это наше решение.     Если на шаге 3 получено ровно 3 завершенных поддерева, а вес оставшегося поддерева в T равен нулю - то объединяем оставшееся поддерево с любым из завершенных и получаем решение.     В противном случае задача решения не имеет.

Зачем нужен вызов “-> max(a,b)” при создании функции?

Нашёл такой пример: def function(a:int,b:str,c:list) -> max(2,3):. Зачем используется -> max(...)?


Ответ

В данной строке
def function(a:int,b:str,c:list) -> max(2,3):
:int, :str, :list, -> max(2,3) - это аннотации. Впервые они предлагаются к введению в Python в PEP 3107, но их назначение четко не регламентировалось (их интерпретация возлагалась на авторов сторонних инструментов).
В качестве аннотации может использоваться любое синтаксически верное выражение Python. При запуске кода интерпретатором выражения, используемые в качестве аннотации, исполняются (поэтому могут вызывать ошибки во время исполнения, например выражение def f() -> max(None, 1): pass вызовет ошибку TypeError, пример от jfs), но никаким специальным образом интерпретатором не обрабатываются (т.е., например, интерпретатор сам не проверяет типы).
Позже было более четко зафиксировано использование аннотаций как аннотаций типов (PEP 484), т.е. после аргументов функции через двоеточие пишем предполагаемый тип аргумента, после -> пишем тип возвращаемого значения функции.
Опять же, интерпретатор их игнорирует, но аннотации типов могут использоваться такими инструментами как mypy или встроенным в PyCharm статическим анализатором кода, чтобы понимать, что в функцию передано (или возвращено) значение не того типа, которое предполагалось, и отображать это как ошибку или предупреждение.
-> max(2,3) с моей точки зрения не несет никакой смысловой нагрузки. Это не аннотация типа, а просто аннотация. Что имел в виду автор примера - загадка. Скорее всего это просто пример использования аннотаций.
Программно получить доступ к аннотациям функции можно через атрибут функции __annotations__
def function(a:int,b:str,c:list) -> max(2,3): pass
print(function.__annotations__)
Результат:
{'a': , 'return': 3, 'c': , 'b': }
Здесь видны прописанные для аргументов типы, и видно, что выражение max(2,3) вычислилось, поэтому в качестве аннотации для возвращаемого значения записалось просто 3.

C#. Вопрос по работе с пространствами имен

Доброго времени суток!
Есть решение под названием RiskAssessment. В нем есть 2 проекта:
1) RiskAssessment.User, в котором находится файл User.cs
2) RiskAssessment.Risk, в котором находится файл Risk.cs
Risk.cs:
using System;
namespace RiskAssessment.Risk { public class Risk { //SomeContent } }
User.cs:
using System.Collections.Generic; using RiskAssessment.Risk;
namespace RiskAssessment.User { public class User { List risks; } }
Код файла User.cs не будет компилироваться, потому как для обращения к типу Risk требуется следующая ссылка:
List risks; // или List
Почему нельзя обратиться к типу Risk, используя просто Risk? Как исправить наименования пространств имен, чтобы доступ к типу Risk был через Risk, а не через Risk.Risk. Помогите пожалуйста разобраться с этим.


Ответ

Проблема в том, что у вас пространство имён (namespace) и класс имеют одинаковое имя. Это не рекомендуется по многим причинам
Попробуйте, например, так:
namespace RiskAssessment.RiskObjects { public class Risk { //SomeContent } }

using RiskAssessment.RiskObjects;
namespace RiskAssessment.UserObjects { public class User { List risks; } }

Дело в том, что алгоритм поиска имён в C# сначала ищет Risk в RiskAssessment.User (и не находит), затем идёт наружу и ищет в RiskAssessment. Там он находит User, но это namespace, так что он не ищет дальше, а выдаёт ошибку.
До рассмотрения using дело даже не доходит.
(Точный алгоритм поиска описан в спецификации языка, раздел 3.8.)

Обновление: Внимательно перечитав алгоритм разрешения имён, я нашёл ещё одно решение, которое работает без переименования:
namespace RiskAssessment.User { using RiskAssessment.Risk; // <-- *внутри*
public class User { List risks; } }
Здесь алгоритм разрешения имён «видит» имя класса Risk, так как оно импортировано во внутреннее пространство имён RiskAssessment.User, и таким образом до «спуска» в пространство имён RiskAssessment дело не доходит.
Тем не менее, всё же совпадающее имя пространства имён и класса — не самая хорошая вещь, так что возможно переименование пространства имён всё же лучше.

Как продублировать символ с помощью printf

printf ("%c", 196);
Как мне сделать так, что символ был напечатан не 1 раз, а допустим 5 раз, чтобы избежать таких строк
printf ("%c%c%c%c%c, 196, 196, 196, 196, 196);
Сторонние библиотеки юзать нельзя, тольк


Ответ

Так не устроит?
for(int i = 0; i < 5; ++i) putchar(196);
Ну, или
for(int i = 0; i < 5; ++i) printf("%c",196);
P.S. Если бы работать в C++, то там символ-заполнитель можно указать -
char k = 'a'; cout << setfill(k) << setw(5) << k << endl;
Но это так, досужие рассуждения, так как вопрос именно о C...

C# xml в цикле for

Помогите разобраться с циклом и xml. Это мой первый вопрос, я школьник, пытаюсь написать программу по созданию теста для одноклассников. Я создал форму, в ней динамически создал боксы и чекбоксы. Скриншот. Можно добавлять сколько угодно табов...
Мне нужно получить следующий результат:
NAME OF THE TEST 2017 Тест по Математики за 2016 год 1 1,5 45 4 Вика Настя Катя ..... .... остальные вопросы N число.... .....
Использую for для сбора данных из боксов, обращаясь к TabControl
XDocument xdoc = new XDocument(); XElement testXML = new XElement("test");//заголовок XElement headXML = new XElement("head","заголовок XML");//заголовок XElement discriptionXML = new XElement("Discriptions","ОПИСАНИЕ ТЕСТА");//описание теста XElement qwXML = new XElement("qw");//начала вопросов XElement questionXMLX = new XElement("q");// начало вопроса XElement questionXMLAY = new XElement("a");// ответ XElement questionXMLAN = new XElement("a");// ответ
XAttribute DiscriptionAttr = new XAttribute("text", "ПУСТО");//собираем текст XAttribute questionXAttr = new XAttribute("text", "ПУСТО");//собираем текст XAttribute questionSRCXAttr = new XAttribute("src", "ПУСТО");//собираем картинку XAttribute questionAAttrN = new XAttribute("right", "no");//собираем текст XAttribute questionAAttrY = new XAttribute("right", "yes");//собираем текст
// TextBoxQuest.Tag = "TxBOXquery"; //Поле вопроса //RadioButton[i].Tag = "rbAnswer"; //Радиобуттон правильного ответа //TextBoxAns[i].Tag = "TxBOXAnswer";//Варианты ответа questionXMLAY.Add(questionAAttrY); questionXMLAN.Add(questionAAttrN); string ctrl ="";//собираем текст из полей string tagz = ""; //смотрим что это за поле int qcount = tabControl1.TabCount * (CountAnswerInTest*2);
for (int itab = 0; itab < tabControl1.TabCount; itab++)//перебираем табы { for (int i = 0; i <= CountAnswerInTest*2; i++)//перебираем внутренние ответы { ctrl = tabControl1.Controls[itab].Controls[i].Text;//собираем текст из полей tagz = tabControl1.Controls[itab].Controls[i].Tag.ToString(); //смотрим что это за поле Console.WriteLine(tagz);//debug if (tagz == "TxBOXquery") //если равно TxBOXquery то это поле с вопросом { Console.WriteLine(ctrl);//debug Console.WriteLine(questionXMLX);//debug questionXMLX.Add(ctrl);//Добавляем его Console.WriteLine(questionXMLX);//debug }//пишем вопрос
if (tagz == "rbAnswer")//если равно rbAnswer то это поле с ответом if (ctrl == "")//если текста нет, то скорее всего это радиобуттон\ { Control ctrlb = tabControl1.Controls[itab].Controls[i]; //присваем чекбокс if (Convert.ToString(ctrlb) == "System.Windows.Forms.RadioButton, Checked: False") //смотрим нажат или нет { Console.WriteLine("False");//debug // questionXMLA.Add(questionAAttrN); int ix = ++i;//убираем непонятные пустые поля string ctrlX = tabControl1.Controls[itab].Controls[ix].Text;//собираем текст из полей
questionXMLX.Add(questionXMLAN, ctrl, ctrlX); //добавляем в xml
} else //если чекбокс не нажат то пишем NO { int ix = ++i;//убираем непонятные пустые поля string ctrlX = tabControl1.Controls[itab].Controls[ix].Text;//собираем текст из полей Console.WriteLine("True");//debug questionXMLX.Add(questionXMLAN, ctrl, ctrlX);/ добавляем в xml // questionXMLA.Add(questionAAttrY);
} } }
qwXML.Add(questionXMLX);// добавляем всё в блок
}//закончили перебирать табы testXML.Add(headXML); testXML.Add(discriptionXML); testXML.Add(qwXML);
xdoc.Add(testXML); xdoc.Save("myXML2.xml");
И получаю следущий результат:
заголовок XML ОПИСАНИЕ ТЕСТА Пишем вопрос тут 11 Ответ 10 Ответ 11 Ответ 12Пишем вопрос тут 22 Ответ 20 Ответ 21 Ответ 22Пишем вопрос тут 33 Ответ 30 Ответ 31 Ответ 32 Пишем вопрос тут 11 Ответ 10 Ответ 11 Ответ 12Пишем вопрос тут 22 Ответ 20 Ответ 21 Ответ 22 Пишем вопрос тут 11 Ответ 10 Ответ 11 Ответ 12Пишем вопрос тут 22 Ответ 20 Ответ 21 Ответ 22Пишем вопрос тут 33 Ответ 30 Ответ 31 Ответ 32
Ошибка получается вот тут, не добавляется новый вопрос, хотя циклы проходят нормально и срабатывает questionXMLX.Add(ctrl), который должен добавлять новый :
Ответ 12Пишем вопрос тут 22
А надо, чтоб было вот так:
Ответ 12 Пишем вопрос тут 22
Не понимаю, почему неправильно работает:
Console.WriteLine(ctrl);//debug Console.WriteLine(questionXMLX);//debug questionXMLX.Add(ctrl);//Добавляем его в xml Console.WriteLine(questionXMLX);//debug
Помогите, пожалуйста.


Ответ

Так происходит, потому что используется один и тот же XElement. Один new XElement("q") эквивалентен <\q>. Для решения твоей задачи надо каждый раз создавать новый XElement, а в конце итерации цикла добавлять в коллекцию qwXML.Add(questionXMLX).
Что-то вроде такого:
XElement questionXMLX = new XElement("q"); // Логика по заполнению questionXMLX qwXML.Add(questionXMLX);
Чтобы лучше понять логику взаимодействия с XElement вот пример кода и XML, который получается в итоге:
XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", "206-555-0144", new XAttribute("Type", "Home")), new XElement("phone", "425-555-0145", new XAttribute("Type", "Work")), new XElement("Address", new XElement("Street1", "123 Main St"), new XElement("City", "Mercer Island"), new XElement("State", "WA"), new XElement("Postal", "68042") ) ) );
На выходе:
Patrick Hines 206-555-0144 425-555-0145

123 Main St Mercer Island WA 68042

Как в C# (WPF) выполнить метод спустя некоторое время после события?

В моем проекте на WPF, есть кнопка, на LeftMouseDown срабатывает событие, в котором спустя 3 секунды пока кнопка мыши зажата, выполнится метод (отправим в базу данные) но если мы отпустим левую кнопку мыши тоесть выполнится другое событие LeftMouseUp нужно отменить выполнения этого метода. Как в коде C# сгенерировать такое поведение.
Для наглядности добавлю свой код, без этой манипуляции

И ViewModel
public Command EngineStartOn { get { return new Command(() =>
{ //Выполнить такую манипуляцию спустя 3 секунды EngineStart = false;
}); } } public Command EngineStartDown { get { return new Command(() => { //Оборвать выполнения функции если не прошло 3 секунды }); } }


Ответ

Ну например так:
CancellationTokenSource cts = null;
async void ScheduleDatabaseUpdate() { if (cts != null) throw new InvalidOperationException("Update already scheduled"); cts = new CancellationTokenSource(); try { await Task.Delay(TimeSpan.FromSeconds(3), cts.Token); await Task.Run(() => <тут запись в базу>); } catch (OperationCanceledException) { } }
void CancelPendingUpdate() { if (cts == null) throw new InvalidOperationException("No pending update"); cts.Cancel(); cts = null; }
ScheduleDatabaseUpdate вызываете на нажатии, CancelPendingUpdate на отпускании мыши.

Как создать npm-пакет, который будет иметь возможность запускаться прямо из терминала по своему имени?

Интересует, как создаются такие npm-пакеты, которые в дальнейшем можно вызывать прямо из терминала?
Например, при установке пакета express-generator, в папку, где лежит бинарник node'а и npm'а (например ~/.local/bin/node/bin/) добавляется ссылка на ../lib/node_modules/[package]/bin/. То есть, поскольку путь к node'у лежит в переменной окружения $PATH, то и к этому пакету тоже теперь есть доступ прямо из терминала. Я могу просто написать express и этот файл начнет выполняться ('~/.local/bin/node/lib/node_modules/express-generator/bin/express-cli.js`).
Что удивляет еще больше, так это 2 другие вещи: почему пакет называется express-generator, а запускается он командой express? И почему этот файл является обычным .js файлом, но запускается из терминала как ни в чем не бывало? Где-то неявно указывается его открытие через Node?
В общем, интересует, как можно создать подобного рода пакет, чтобы сразу при его установке добавлялась ссылка на .js файл в путь к node'у, чтобы мой пакет можно было запустить прямо из терминала.
Благодарю.
P.S. Если где-то путаю термины, то прошу меня поправить, ибо только начинаю разбираться во всей этой каше.

По просьбе "сформулировать вопрос более точно". Как создать npm-пакет, который будет иметь возможность запускаться прямо из терминала по своему имени? Подробности описаны выше.


Ответ

За это отвечает секция bin в package.json:
"bin": { "mytool": "bin/tool.js" }
tool.js, в свою очередь, должен содержать так называемый шебанг - #!/usr/bin/env node, например.
При установке такого пакета, в node_modules/.bin появится исполняемый бинарник mytool. Точнее симлинк mytool -> ../yourpackage/bin/tool.js.
Запускать локально установленные утилиты можно как $(npm bin)/mytool
При установке пакета с -g он попадёт в глобальный node_modules/.bin, который присутствует в $PATH. Тогда его можно вызывать просто, как mytool

Деструктор производного класса

Следует ли объявлять деструктор производного класса виртуальным, если в базовом классе он уже помечен таковым? Т.е., необходимость в виртуальном деструкторе в базовом классе мне ясна, в производном - нет. Возможно, не задумывался бы об этом, если бы не натыкался на статьи, в которых даны примеры, где по мнению авторов наличие виртуальных деструкторов в производных классах является, видимо, хорошим тоном.


Ответ

Согласно стандарту C++ (7.1.2 Function specifiers)
5 The virtual specifier shall be used only in the initial declaration of a non-static class member function;
То есть спецификатор функции virtual обязан присутствовать только в первоначальном объявлении функции.
Тем не менее я соглашусь, что присутствие этого спецификатора в объявлениях функций в производных классах делает код более ясным и самодокументируемым.
Что касается деструкторов, то, опять-таки, согласно стандарта C++ (10.3 Virtual functions)
6 Even though destructors are not inherited, a destructor in a derived class overrides a base class destructor declared virtual; see 12.4 and 12.5.
То есть если деструктор в базовом классе объявлен со спецификатором virtual, то деструктор в производном классе переопределяет деструктор базового класса, то есть ведет себя как виртуальная функция.

JQuery поменять элементы местами

Как можно менять местами блоки? Чтобы каждые 10 секунд последний блок вставал на место первого, второй на место третьего, третий на место последнего. И так по кругу.

0
1
2
3


Ответ

При перемещении блока не надо удалять из старого места, при вставке в новое он будет удален из старого автоматически. Сделал без jQuery на чистом JS.
var parent = document.getElementById('container'); setInterval(function() { var div = parent.querySelector('div'); parent.appendChild(div); //автоматически удалится из старого места }, 1000); #container div { float: left; width: 100px; height: 100px; margin: 20px; border: 2px solid silver; border-radius: 5px; }

0
1
2
3

Неатомарные операции С++

Какие операции называются неатомарными? Если можно с примером.


Ответ

Грубо - которые могут оказаться прерванными другим потоком.
Примеры? Ну, например
if (a) { f(a); }
Пока вы считали a, которое равно true, и собрались выполнять f(a), другой поток уже сделал a равным false :)
Или даже такая экзотика - в одном потоке вы присваиваете значение переменной из двух слов. Первое слово записалось, прерывание, другой поток читает из памяти нечто полузаписанное. Работает, записывает что-то свое. Тут снова управление возвращается к первому потоку, и он дописывает вторую половину нашей переменной...

В виртуальном терминале кириллица отображается квадратиками

Захожу в виртуальный терминал через ctrl+alt+f2, прописывая ls, и у тех каталогов, которые названы на русском языке, имена отображаются квадратиками.
Как исправить это?
вот что выводит после команды locale
$ locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=


Ответ

Ответ на мой вопрос дал alexander barakin в комментариях.
И когда я решил решил проблему, то мои действия были такие:
Установил шрифт Terminus из репозитория. Через sudo открыл фаил vconsole.conf при помощи vim, который находится в папке etc.
cd .. cd .. cd etc sudo vim vconsole.conf Отредактировал файл так:
LOCALE="ru_RU.UTF-8" KEYMAP="ru" FONT="ter-v16v" CONSOLEMAP="" Сохранил изменения и перезагрузил компьютер.
Тема закрыта.

Различного вида критические ошибки в программировании

Обычно стараюсь все узнавать сам, но в последнее время начал мучать такой вопрос: "Может ли случиться такое, что из-за различного вида ошибок, допущенных программистом, система может, грубо говоря, нагнуться?"
Собственно, вопрос возник при чтении книги Джесса Либерти "Освой с++ за 21 день", в которой сказано, что блуждающие указатели могут повести себя по-разному, могут даже удалить файлы. И особенно сильно удивило то, что при присвоении некого значения массиву, который не содержит такого элемента, например, массив A содержит 5 элементов, и мы присваиваем значение 6 элементу, цитирую:
Ни в коем случае не запускайте эту программу у себя на компьютере, это может привести к поломке системы.
Правда ли это?


Ответ

Система может "нагнуться". Но если Вы пишите обычное приложение, не запускаете его с под администратора/рута, то "уложить" систему достаточно сложно - современные системы хорошо сопротивляются пользователю.
И особенно сильно удивило то что при присвоении некого значения массиву который не содержит такого элемента, например, массив A содержит 5 элементов и мы присваиваем значение 6 элементу, цитирую " Ни в коем случае не запускайте эту программу у себя на компьютере это может привести к поломке системы". Правда ли это?
О такой ошибке почти все компиляторы знают. И ничего плохого не случиться - компилятор выделит массив не на 5 элементов, а обычно как минимум на 6. А потом просто проверит, а не записал кто то за пределами массива. И если такое произошло - Вы об этом узнаете явно. (студия может явно ругнуться в консоль).
А вот если писать не в 6 элемент, а в 1000...000, вот тут может быть несколько ситуаций.
случайно перетрутся данные, которые принадлежат Вашей программе. Другие функции будут "удивлены". Одна из самых типичных ситуаций. перетрутся данные в "паддингах" - пустых местах между переменными. Ничего плохого не будет. случайные данные попытаются записать в защищенную область память - будет исключение и программа скорее всего закрешится.
То есть, максимум, что может случиться, это либо программа будет вести себя странно, либо просто упадет.
Могут ли "блуждающие указатели" удалить файл? могут. Но обычно эта логика в программе уже есть.
Если сильно боитесь эти ужасов, установите виртуальную машину и в ней все делайте. В худшем случае просто восстановите виртуальную машину. Выйти за пределы виртуальной машины ещё нужно постараться.

Плавная прокрутка к якорю без jQuery

Есть отличный скрипт плавной прокрутки на jQuery.
var $page = $('html, body'); $('a[href*="#"]').click(function() { $page.animate({ scrollTop: $($.attr(this, 'href')).offset().top }, 400); return false; });
Как можно отобразить на чистом JS?


Ответ

// собираем все якоря; устанавливаем время анимации и количество кадров const anchors = [].slice.call(document.querySelectorAll('a[href*="#"]')), animationTime = 300, framesCount = 20; anchors.forEach(function(item) { // каждому якорю присваиваем обработчик события item.addEventListener('click', function(e) { // убираем стандартное поведение e.preventDefault(); // для каждого якоря берем соответствующий ему элемент и определяем его координату Y let coordY = document.querySelector(item.getAttribute('href')).getBoundingClientRect().top; // запускаем интервал, в котором let scroller = setInterval(function() { // считаем на сколько скроллить за 1 такт let scrollBy = coordY / framesCount; // если к-во пикселей для скролла за 1 такт больше расстояния до элемента // и дно страницы не достигнуто if(scrollBy > window.pageYOffset - coordY && window.innerHeight + window.pageYOffset < document.body.offsetHeight) { // то скроллим на к-во пикселей, которое соответствует одному такту window.scrollBy(0, scrollBy); } else { // иначе добираемся до элемента и выходим из интервала window.scrollTo(0, coordY); clearInterval(scroller); } // время интервала равняется частному от времени анимации и к-ва кадров }, animationTime / framesCount); }); }); h2 { margin-bottom: 100vh; }

heading 1

heading 2

heading 3

heading 4


Как отпустить длл, чтобы её можно было заменить?(Assembly,Methodinfo,invoke)

Подскажите, пожалуйста, как не держать dll, после использования следующей конструкции:
Assembly a = Assembly.LoadFile(dll); Type t = a.GetTypes().FirstOrDefault(x => x.Name == "MainDllClass"); MethodInfo mi = t.GetMethod("WorkTimer"); mi.Invoke(null, arguments);
Вызывается метод WorkTimer из класса MainDllClass файла dll. Почему-то после отработки, он продолжает использоваться и не дает перезаписать файл dll
хм кажется получается вот так:
AppDomain dom = AppDomain.CreateDomain("some"); AssemblyName assemblyName = new AssemblyName(); assemblyName.CodeBase = pathToAssembly; Assembly a = dom.Load(assemblyName); Type t = a.GetTypes().FirstOrDefault(x => x.Name == "MainDllClass"); MethodInfo mi = t.GetMethod("WorkTimer"); mi.Invoke(null, arguments); AppDomain.Unload(dom);
Буду тестировать, потом отпишусь.


Ответ

Дело в том, что методы Assembly.Load(), Assembly.LoadFrom(), Assembly.LoadFile() загружают сборку в текущий домен приложения на постоянной основе. Эта загрузка блокирует файлы сборок. Единственный способ выгрузить сборку - выгрузка целого домена приложения. Существует прием, позволяющий избежать блокирования сборок, который называется теневым копированием: MSDN. Теневое копирование сборок

Если выгрузка библиотеки вам не требуется, а требуется лишь чтобы библиотеку можно выло безболезненно удалить/заменить при работающем экземпляре приложения (например, обновление ASP.NET приложения), то можно использовать перегруженную версию Assembly.Load() принимающую "образ" библиотеки в виде массива байтов, например:
Библиотека:
namespace TestLib { public class Summator { public int Sum(int x, int y) => x + y; } }
Использование:
static void Main(string[] args) { var raw = File.ReadAllBytes(@"Путь\До\Файла\TestLib.dll"); var assembly = Assembly.Load(raw); Type type = assembly.GetTypes().First(x => x.Name == "Summator"); var instance = Activator.CreateInstance(type); MethodInfo mInfo = type.GetMethod("Sum"); var res = (int)mInfo.Invoke(instance, new object[] { 10, 15 }); Console.WriteLine(res); Console.ReadLine(); }

Как отключить систему управления версиями Git? [дубликат]

На данный вопрос уже ответили: Как правильно удалить Git tracking (контроль версий)? 3 ответа Подскажите, как отключить систему управления версиями Git, при использовании расширения GitHub Extension for Visual Studio, слишком рано ее включил...
Используется Visual Studio 2015 (14.0.25123.00 Update 2)

Отличие вопроса состоит в том, что для новичка в Visual Studio функция "Добавить решение в систему управления расширениями..." включает систему управления версиями. И тем же способом хочется ее отключить, но этого в меню нет. По сочетаниям слов (система управления версиями Git) я и стал искать ответ.
Слова "версионирование", "git tracking", "git init", не придут в голову новичку, и уж тем более не придет в голову удалять какую-то папку. Ищем функцию отключения системы управления версиями, а получаем удаление папки.


Ответ

Папку .git удали, которая находится в корне решения

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

Здравствуйте такая проблема есть блок с сообщениями высотой 400px в него добавлено css свойство overflow-y: scroll; и блок прокручивается вниз только на 400px а как сделать чтобы прокручивался в самый низ вот сам код
$('.message-block').animate({ scrollTop: $('.message-block').height() }); .message-block { position: sticky; background-color: #eef2f4; height: 400px; overflow-y: scroll; padding-top: 10px; border-radius: 10px; } .text-sender-read { background-color: #8bda84; width: 60%; padding: 5%; border-radius: 30px; } .text-sender-unread { box-shadow: 0px 0px 14px 2px #3675d8; } .sender{ position: relative; } .incoming { position: relative; } .text-incoming { background-color:rgba(173, 164, 172, 0.31); width: 60%; padding: 5%; border-radius: 30px; float: right; } .page_square_photo { position: relative; display: inline-block; height: 82%; border-radius: 50%; border: 3px solid #b6cada; width: 70px; /* margin-left: 6px; */ background-size: cover; background-repeat: no-repeat; background-position: 50% 50%; } .page_photos_module { padding: 5px 0px 20px; height: 110px; } .inline-message { display: table-row-group; }

tyhrgedwsqa uyjthgr4fewq

yhtrgeythrgfe

rbtefdw

yhtg4rfew

tyhrge

rtgefw

ytyhrgwe tyhrgew

yhtrg4e

yuujthrge

hrtgefw

y4tre

jtyhr4e

ytehrg4ew

trew

rthgweqq

rgefwq

yujthtr4e

y54r

trgedw

jyhtg4re

yutjhrg4e

yujthgr4e

gfbvrweqq

y5t4re

jyhtgrteww

tyhrgew

ymtnhrgeww

оноеркп4

yt4r

nrtberewfdqq

tjyhrgf4e

jyhty4r

ujy4tr

yhtg4re

jhy4gtre

trhgfew

jyh5g4re

jythrg4fe

tyrhge

hrtgewww

hngrtgrwe

hgrgtewqw

trhgweq



Ответ

Вот как я сделал, добавил еще один контейнер в ваших сообщениях теперь они в контейнере с классом message-block-inner. и у него высота автоматически ровно высоты его содержимого. И изменил прокрутку и сделал прокрутку до конца этого блока с классом (message-block-inner).
$('.message-block').animate({ scrollTop: $('.message-block-inner').height() }); .message-block { position: sticky; background-color: #eef2f4; height: 400px; overflow-y: scroll; padding-top: 10px; border-radius: 10px; } .text-sender-read { background-color: #8bda84; width: 60%; padding: 5%; border-radius: 30px; } .text-sender-unread { box-shadow: 0px 0px 14px 2px #3675d8; } .sender{ position: relative; } .incoming { position: relative; } .text-incoming { background-color:rgba(173, 164, 172, 0.31); width: 60%; padding: 5%; border-radius: 30px; float: right; } .page_square_photo { position: relative; display: inline-block; height: 82%; border-radius: 50%; border: 3px solid #b6cada; width: 70px; /* margin-left: 6px; */ background-size: cover; background-repeat: no-repeat; background-position: 50% 50%; } .page_photos_module { padding: 5px 0px 20px; height: 110px; } .inline-message { display: table-row-group; }

tyhrgedwsqa uyjthgr4fewq

yhtrgeythrgfe

rbtefdw

yhtg4rfew

tyhrge

rtgefw

ytyhrgwe tyhrgew

yhtrg4e

yuujthrge

hrtgefw

y4tre

jtyhr4e

ytehrg4ew

trew

rthgweqq

rgefwq

yujthtr4e

y54r

trgedw

jyhtg4re

yutjhrg4e

yujthgr4e

gfbvrweqq

y5t4re

jyhtgrteww

tyhrgew

ymtnhrgeww

оноеркп4

yt4r

nrtberewfdqq

tjyhrgf4e

jyhty4r

ujy4tr

yhtg4re

jhy4gtre

trhgfew

jyh5g4re

jythrg4fe

tyrhge

hrtgewww

hngrtgrwe

hgrgtewqw

trhgweq


console.log('hello',)

Не знал как назвать, кто придумает по умнее, буду признателен. Проблема в том, что PhpStorm не подчеркнул и я упустил из виду:
console.log('hello',)
Данная конструкция роняла сайт на windows машинах, когда на mac все работало. Не знаю как искать, но как по спецификации, допускается ли такое?
По мне дак вполне нормально, вторая переменная undefined


Ответ

Давайте откроем стандарт языка ECMA-262 7-редакция от июня 2016
Смотрим как вызываются у нас функции 12.3.4 Function Calls
Как видим при вызове функции ей передается объект Arguments. Который определяется следующим образом.
Arguments[Yield] : ( ) ( ArgumentList[?Yield] )
То есть он может быть либо пустым, либо передаваться как ArgumentList
ArgumentList : AssignmentExpression ArgumentList , AssignmentExpression
Как видим список состоит из значений AssignmentExpression, которые разделены запятыми. Тут начинается самое сложное в стандарте, так как AssignmentExpression это целая куча различных вариантов значений.
AssignmentExpression: ConditionalExpression YieldExpression ArrowFunction LeftHandSideExpression LeftHandSideExpression AssignmentOperator AssignmentExpression
AssignmentOperator : one of *= /= %= += ‐= <<= >>= >>>= &= ^= |= **=
То есть мы может указывать просто кучу всяких видов параметров: условные выражения, стрелочные функции, различные комбинации выражений, итераторы и многое другое. Но в общем-то нас интересует простейший вариант: LeftHandSideExpression
LeftHandSideExpression: NewExpression CallExpression
Дальше идет целая вакханалия ссылок. Но в итоге все сводится либо к различным выражениям, либо в нашем случае к простейшим IdentifierName и Identifier. А они в свою очередь имеют такое определение:
IdentifierName :: IdentifierStart IdentifierName IdentifierPart
IdentifierStart :: UnicodeIDStart $ _ \ UnicodeEscapeSequenc
То есть в любом случае должны быть хотя бы одна буква Юникода и таким образом AssignmentExpression не может состоять из пустоты. Там обязательно должно идти хоть что-то, иначе было бы в стандарте AssignmentExpression помечен опционально (opt) для ArgumentList
P.S. - И пусть потом кто-то попробует сказать, что стандарты это легко.

Нет права на чтение файла, хотя я состою в группе владельца файла

Есть например файл 1.png.
Он принадлежит владельцу и группе www-data:www-data. На файле стоят права -rw-rw----
Как я понимаю, просматривать файл может владелец и все кто состоит в группе владельца, т.е. в группе www-data
Мой пользователь andrey. Я добавил его в группу www-data командой $ sudo usermod -a -G www-data andrey. Если просмотреть командой $ groups andrey, то в списке группа www-data есть.
Но почему-то права на просмотр этого файла всё равно нет. Т.е. я не могу открыть эту картинку в Ubuntu 16.04 в обычном проводнике. Почему так происходит? Или я не правильно понимаю механизм прав доступа? Подскажите пожалуйста.


Ответ

Чтобы изменения вступили в силу необходимо перелогиниться.

Ошибка компилятора C++

Ошибка C1091 ограничение компилятора: длина строки превышает 65535 байт
Можно его как-то устранить без использования strcpy_s ?


Ответ

Провел такой эксперимент (Visual C++ 2015). Создал массив типа
unsigned char sss[] = {
0x50,0x48,0x51,0x47,0x48,0x55,0x4d,0x45,0x41,0x59, ...
и далее - миллион байт. Скомпилировалось на ура.
Преобразуйте свою строку в такой байтовый массив - только и разницы, что не строка будет, а массив, а обращаться-то все равно можно будет через указатель :)
Вот, скомпилируйте и запустите:
#include #include #include
int main(int argc, const char * argv[]) { FILE * f = fopen("test.cpp","wt");
fprintf(f, "#include
" "char sss[] = {
"); for(unsigned int i = 0; i < 1000000; ++i) { fprintf(f,"0x%02x,", rand()%26+'A'); if (i % 40 == 39) fprintf(f,"
"); } fprintf(f,"};
" "int main() {
" "puts(sss);}
"); fclose(f); system("cl test.cpp"); }

Как получить доступ к postgres консоли в linux?

Я установил PostgresSQL на linux и когда я пытаюсь войти то получаю:
$ psql postgres psql: FATAL: role "pavel" does not exist
На MacOS у меня была отдельная консоль для postgres которая устанавливалась по умолчанию вместе с базой. Для linux нет такой возможности?
Почему мне не предлагается выбрать роль?
Как мне войти в базу?


Ответ

$ psql postgres
Означает, что вы хотите авторизоваться с настройками по-умолчанию в базу postgres. Не пользователем postgres, а в базу данных под названием postgres. Пользователь указывается явно ключом -U либо записывается в переменной окружения PGUSER либо используется тот, от имени которого открыта консоль. Очевидно pavel - это имя вашей учётной записи.
Поэтому при работе от пользователя postgres в базу postgres зайти можно (это не значит что всегда можно будет зайти, можно настроить что и нельзя будет).
psql -U postgres postgres
Так же на настройках по-умолчанию используется unix-сокет и авторизация peer в pg_hba.conf. Т.е. проверяется, что пользователь, от имени которого работает консоль совпадает с именем пользователя в базе. Т.е. указанная выше команда не сработает и выдаст ошибку peer-аутентификации. Понадобится править pg_hba.conf, например, для использования md5 авторизации - с использование пароля.
Если вы хотите часто заходить в консоль суперпользователем, то проще завести пользователя совпадающего с именем в консоли, нежели указывать постоянно пользователя и базу
create user pavel with superuser login password 'пароль'; create database pavel owner pavel;
После вы сможете заходить просто набрав
psql
Если же вам не нужна постоянно административная консоль (а зачем она может быть постоянно нужна, если только вы не ДБА?), то уберите superuser из создания пользователя. Для редких административных задач вполне достаточно способа авторизации через
sudo -u postgres psql postgres

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

Почему не отлавливается исключение?
class A { public: void SHOW() { std::cout << "A" << std::endl; throw; } };
int main() { try { A* ptr = new A; ptr->SHOW(); } catch (...) {
} }


Ответ

Какое исключение? Оператор throw без аргумента означает "сгенерировать перехваченное исключение заново" и применяется только в блоке catch
Если бы вы написали что-то типа throw 0 или throw "Error" - дело другое. А так...
Вот ситуация, где ваш throw действительно сработает:
class A { public: void SHOW() { std::cout << "A" << std::endl; throw; } };
int main() { try { A* ptr = new A; try { throw 5; } catch (...) { ptr->SHOW(); } } catch(int x) { cout << x << endl; } }

Как включить ES6 синтаксис в webstorm?

Webstorm подсвечивает стрелочные функции красным и пишет Expression statement is not assignment or call, что делать?


Ответ

Нужно зайти в настройки (Ctrl+Alt+S) открыть там Languages & Frameworks - Javascript и переключить Javascript language version на ECMAScript 6

Как ограничить область видимости карты, Map API Android?

Возможно ли как то ограничить область видимости, например квадрат на карте, за который нельзя выйти перемещением карты?


Ответ

попробуйте так
private GoogleMap mMap; // Create a LatLngBounds that includes the city of Adelaide in Australia. private LatLngBounds ADELAIDE = new LatLngBounds( new LatLng(-35.0, 138.58), new LatLng(-34.9, 138.61)); // Constrain the camera target to the Adelaide bounds. mMap.setLatLngBoundsForCameraTarget(ADELAIDE);
более подробно на сайте https://developers.google.com/maps/documentation/android-api/views#_14

Повторная установка свойств в DataTemplate при смене активной вкладки в TabControl

В программе используется TabControl и каждая его вкладка представлена юзерконтролом с таблицей DataGrid.
Когда активная вкладка меняется, то свойство ItemsSource каждый раз устанавливается заново, что приводит к таким неприятностям как потеря предыдущего состояния полосы прокрутки и всех выделенных строк в таблице, да и просто приходится каждый раз ожидать какое-то время для подгрузки данных.
В коде при этом ничего не изменяется.
В чем проблема?
MainWindow:

UserControl:


Ответ

Дело в том, что TabControl старается использовать один и тот же контрол для контента всех табов. В связи с этим, конечно, визуальное состояние теряется.
Я для себя эту проблему решал так:
У TabControl убрал контент, оставил только табы. Поскольку стандартный TabControl оставляет место, пришлось добавить отрицательный отступ снизу. Под TabControl'ом расположил Grid, в котором хранились все View для контента табов, показ нужного проводился через переключение Visibility. Чтобы не делать это вручную, я использовал стандартный трюк с ItemsControl'ом ListBox'ом.
Вот полный код:

VM-классы:
class VM { } class VM1 : VM { public string Header { get { Debug.Print("VM1.Header.get"); return "Что-то"; } } public string Content { get { Debug.Print("VM1.Content.get"); return "В лесу родилась ёлочка"; } } } class VM2 : VM { public string Header { get { Debug.Print("VM2.Header.get"); return "Кто-то"; } } public string Content { get { Debug.Print("VM2.Content.get"); return "И Гена-крокодил"; } } }
DataContext
new VM[] { new VM1(), new VM2() }
Результат:

При этом геттеры срабатывают только по разу, что можно видеть в логе.

Не загружается фотография из галереи (FileNotFoundExeption)

Не могу загрузить фотографию из галереи и отправить ее в post-запросе. Прикладываю код:
public void onClickImageViewAvatar(View view) { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, RESULT_LOAD_IMAGE); }
@Override protected void onActivityResult(int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data);
if (resultCode == RESULT_OK) { try { final Uri imageUri = data.getData(); final InputStream imageStream = getContentResolver().openInputStream(imageUri); final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); File file = new File(imageUri.toString());
String URL = "http://*****"; RequestParams requestParams = new RequestParams(); requestParams.put("photo", file);// ошибка здесь requestParams.put("token",user.getToken()); requestParams.put("user_id", user.getUser_id());
client.post(URL, requestParams, new JsonHttpResponseHandler() {
@Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { Log.i("fg", "change avatar " + response.toString()); try { String status = response.getString("status"); if (Objects.equals(status, STATUS_FAIL)) {
} else if (Objects.equals(status, STATUS_SUCCESS)) { imageViewAvatar.setImageBitmap(selectedImage); }
} catch (JSONException e) { e.printStackTrace(); } }
});
} catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(ProfileSettings.this, "Something went wrong", Toast.LENGTH_LONG).show(); }
} else { Toast.makeText(ProfileSettings.this, "You haven't picked Image", Toast.LENGTH_LONG).show(); } }
Вывод:
java.io.FileNotFoundException at com.loopj.android.http.RequestParams.put(RequestParams.java:285) at com.loopj.android.http.RequestParams.put(RequestParams.java:247) at com.example.uncolor.aroundme.ProfileSettings.onActivityResult(ProfileSettings.java:302) at android.app.Activity.dispatchActivityResult(Activity.java:6295) at android.app.ActivityThread.deliverResults(ActivityThread.java:3929) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3976) at android.app.ActivityThread.access$1300(ActivityThread.java:176) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1578) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5747) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1104) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)
Заранее благодарю за помощь!


Ответ

Возвращенный Uri не всегда является File. Вам нужно получить абсолютный путь до выбранного изображения с помощью ContentResolver
final Uri imageUri = data.getData(); Cursor c = getContentResolver().query(imageUri,null,null,null,null); if (c.moveToNext()) { String path = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA)); File file = new File(path); RequestParams requestParams = new RequestParams(); requestParams.put("photo", file);// ошибки уже нет }
c.close(); // не забудьте курсор закрыть

Java - вопрос про ресурсоемкость параметров-объектов в методах

Как известно, объекты передаваемые в функциях являются ссылками, поэтому напрашивается такой вопрос: примерно одинаково затратно будут первые два способа либо второй практически равноценен созданию новых объектов, что, как я понимаю, безумно затратно (третий способ)?
Первый:
class A {
ArrayList < Point > list;
public A() { list = new ArrayList < Point > (); //представим, что тут лист заполняется сотней новых объектов update(); }
void update() { for (int i = 0; i < 100; i++) { list.get(i).set(i, i); // } } }
Второй:
class B {
ArrayList < Point > list;
public B() { list = new ArrayList < Point > (); //представим, что тут лист заполняется сотней новых объектов update(list); }
void update(ArrayList < Point > p) { for (int i = 0; i < 100; i++) { p.get(i).set(i, i); // } } }
Третий:
class С {
ArrayList list;
public С() { list = new ArrayList (); //представим, что тут лист заполняется сотней новых объектов list = update(); }
ArrayList update() { ArrayList pp = new ArrayList (); pp.addAll(list); for (int i = 0; i < 100; i++) { pp.get(i).set(i, i); // } return pp; } }
Смело использовать второй способ или все же продолжить проводить операции только с полями классов, если возможно?


Ответ

Первые два способа по стоимости практически одинаковы. Передача ссылочного типа есть не что иное, как передача ссылки (то есть, указателя, если вы знакомы с С или C++). Размер ссылки равен размеру одного регистра процессора на популярных платформах (то есть, практически бесплатно). Второй способ, однако, лучше тем, что у него меньшая связность: ваш метод update может использоваться не только с полем A.list, а и с любым другим объектом подходящего типа.
Третий способ, разумеется, дороже (особенно для больших списков): у вас дополнительные расходы на копирование списка (не ссылки на список, а данных списка!).

Работа с ошибками в С++. Деление на ноль

Пишу свой проект в учебных целях для работы с обыкновенными дробями.
#include #include "simple_math.h"
using namespace std; using namespace simple_math;
int main() { cout << fraction(1, 2) + fraction(1, 3); // в результате выводит "5 / 6" return 0; }
Что если знаменатель какой-то дроби будет равен нулю. Понятно, что нужно выкинуть ошибку, но как это сделать?
if(b == 0) { // ОШИБКА! }


Ответ

Если вы хотите работать по C++'ному, то нужно генерировать исключение. Можно собственного типа, можно наследовать от стандартного exception - это уже вопрос стиля и предпочтений. Примерно так -
class DivideByZero {};
...
if (b == 0) throw DivideByZero();
...
try {
cout << fraction(1, 2) + fraction(1, 3); // в результате выводит "5 / 6" } catch(DivideByZero&) { cerr << "Divide by zero error!
" }
Или, если воспользоваться стандартным - думаю, тут правильнее invalid_argument - то
if (b == 0) throw invalid_argument("Divide by zero error in fraction!");
...
try {
cout << fraction(1, 2) + fraction(1, 3); // в результате выводит "5 / 6" } catch(exception&e) { cerr << e.what() << endl; }

Как я могу в .net сериализовать GUID без дефисов?

Как я могу в .net сериализовать в формат XML GUID без дефисов?
Структура выходного документа не важна.
Необходимо, например, вместо 5c88f0fc-9edf-4428-9ee1-b28ba2a5f03c получить 5c88f0fc9edf44289ee1b28ba2a5f03c


Ответ

В качестве воркэраунда можно использовать такую конструкцию:
public class Data { public int X { get; set; }
[XmlIgnore] // это не сериализуем public Guid Y { get; set; }
[XmlElement(ElementName = "Y")] // а вместо Y сериализуем вот это public string YSerializable { get => Y.ToString("N"); set => Y = Guid.Parse(value); } }
Получаем XML:
1 0102030405060708090a0b0c0d0e0f10
Минус: лишнее свойство, нужное лишь для сериализации.

В качестве альтернативы, можно реализовать IXmlSerializable. Но это, наверное, больше мороки.