Страницы

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

суббота, 7 марта 2020 г.

Операторы перегрузки

#cpp #перегрузка_операторов


Доброго времени суток! Можете понятно объяснить про перегрузку операторов?
Нужно создать класс для представления простой дроби, с чем я справилась, но никак
не могу понять, как перегрузить операции +, - и так далее.

class SimpleFraction
{
private:
int a,
    b;
public:
SimpleFraction(int a1, int a2)
{
    setSimpleFraction(a1, a2 );
    if (a2 == 0)
        throw std::runtime_error("zero division error");
}

void setSimpleFraction( int a1, int a2)
{
    a = a1;
    b = a2;
}

void getSimpleFraction()
{
    cout << a << "/"<< b ;
}
 };


Классы только начала изучать, так что могут быть ошибки
    


Ответы

Ответ 1



У вас тут, как говорится, корова не валялась :) Вы должны, вообще-то, после каждого действия дробь упрощать - искать НОД числителя и знаменателя и сокращать... Далее - зачем вам setSimpleFraction? Это можно сделать просто в конструкторе... Словом, должно быть примерно так: class SimpleFraction { static int gcd(int m, int n) // Вычисление НОД { while(m && n) if (m < n) n %= m; else m %= n; return (m == 0) ? n : m; } private: int a, b; public: SimpleFraction(int a1 = 0, int a2 = 1):a(a1),b(a2) { if (a2 == 0) throw std::runtime_error("zero division error"); } // Нас устраивают копирование и присваивание по умолчанию SimpleFraction(const SimpleFraction&) = default; SimpleFraction& operator=(const SimpleFraction&) = default; // Перегрузка оператора вывода в поток friend ostream& operator<<(ostream&out,const SimpleFraction& f) { return out << f.a << "/" << f.b; } friend SimpleFraction operator +(const SimpleFraction&x, const SimpleFraction&y) { int a = x.a*y.b + x.b*y.a; // Числитель int b = x.b*y.b; // Знаменатель int n = gcd(a,b); // НОД return SimpleFraction(a/n,b/n); } SimpleFraction operator -(const SimpleFraction&y) const { int aa = a*y.b - b*y.a; // Числитель int bb = b*y.b; // Знаменатель int n = gcd(aa,bb); // НОД return SimpleFraction(aa/n,bb/n); } friend SimpleFraction operator *(const SimpleFraction&x, const SimpleFraction&y) { int a = x.a*y.a; // Числитель int b = x.b*y.b; // Знаменатель int n = gcd(a,b); // НОД return SimpleFraction(a/n,b/n); } }; int main() { SimpleFraction a(2,3), b(3,5), c(4,9); SimpleFraction x = a+b; cout << x << endl; x = c*b; cout << x << endl; x = a-c; cout << x << endl; } перегрузка операторов - это просто функция особого вида, с именем operator @, где @ - тот самый оператор. Может быть членом класса (тогда первый ее неявный параметр - *this, может быть свободной - как в приведенном выше коде. В вашем случае лучше свободная, и возвращающая новое значение типа SimpleFraction - как я сделал с операторами + и *, но можно и член класса - см. оператор -. Они просто вычисляют новую дробь, выполняют ее сокращение, и возвращают новое значение. Так достаточно или что-то надо разъяснить подробнее?

Свойство display: table-cell не срабатывает на инпутах

#html #css #вёрстка #input #layout


Нужно сделать, чтобы кнопки в ряд занимали всю ширину .row.

Сейчас они смещены влево и не тянутся на всю ширину, хотя им присвоено свойство display:
table-cell;.

Вопрос: почему display: table-cell не работает для инпутов? И можно ли достичь желаемого
результата не оборачивая input в дополнительные div?



.row{
  display: table;
  table-layout: fixed;
  width: 100%;
  border-spacing: 1px 0;
  background-color: #eee;
 }
.input{
  display: table-cell;
 }


Ответы

Ответ 1



Нужно переделывать на Flexbox, если количество кнопок неизвестно: .row { height: 25px; display: flex; flex-direction: column; flex-wrap: wrap } .row input { page-break-inside: avoid; break-inside: avoid; }
Или же поставить ширину 25%, если их количество фиксированно: .row{ display: table; table-layout: fixed; width: 100%; border-spacing: 1px 0; background-color: #eee; } .input{ width: 25%; /* Убираем влияние padding и border на конечную ширину input */ box-sizing: border-box; /* Обнуляем margin */ margin: 0; }


Ответ 2



Можно заменить display: table на display: flex + добавить свойство для потомков flex-grow: 1. .row { display: flex; width: 100%; border-spacing: 1px 0; background-color: #eee; } .input { flex-grow: 1; }


Нужно ли проверять SQLiteDatabase db на null?

#android #sqlite


В своем андроид-приложении ни разу не проверял db != null, при этом запросы работают.
Прочитал, что надо проверять, к примеру, как в следующем коде.

SQLiteDatabase db = new ContactDbHelper(
                        getApplicationContext()).getWritableDatabase();
if (db != null) {
                 Toast.makeText(getApplicationContext(),
                 "DB Contacts is created", Toast.LENGTH_LONG).show();
}else {
                 Toast.makeText(getApplicationContext(),
                 "Error create database!", Toast.LENGTH_LONG).show();
}


Вопрос такой, нужно ли проверять SQLiteDatabase db на null? Это просто подстраховка
и если да, по каким причинам БД может не создаться, при условии, что код рабочий? 
    


Ответы

Ответ 1



Код открытия БД ищет БД по пути задаваемому методом Context.getDatabasePath(), легко может случиться, что какая-то сволочь однажды решит перегрузить этот метод в своем Activity и указать путь на внешний носитель - тогда вас будет ждать легкий Überraschung :) Так что проверять надо все таки.

Можно ли в Visual Studio собирать проект на лету?

#visual_studio #aspnet_mvc #iis


При компиляции и запуске проекта ASP.NET MVC Core часть .cs файлов блокируется студией
и что б изменить код- надо "выключать сборку", изменять код, заново компилировать и
запускать изменённый проект, затрачивая время. 

Можно ли на лету после изменения .cs файла собрать проект и тут же увидеть в браузере
обновлённые данные, не перезапуская весь IIS ?
    


Ответы

Ответ 1



Можно, если использовать компьютер в качестве локального веб-сервера. Не путать с IIS Express, который открывает Visual Studio при запуске проекта. Следует заметить что компонент IIS включен как часть установки Windows как для сервера, так и для рабочих машин. Каждая версия OS Windows предлагает свою версию IIS: Windows 8 - IIS 8, Windows 7 - IIS 7/7.5 Чтобы установить его, необходимо выполнить следующие действия: Открыть панель управления Открыть "Программы" Открыть "Включение или отключение компонентов Windows". Выбрать Internet Information Services (Службы IIS) Убедитесь, что вы выбрали поддержку ASP.NET. Для этого раскройте узел Службы Интернета --> Компоненты разработки приложений --> ASP.NET (Internet Information Services --> World Wide Web Services --> Application Development Features --> ASP.NET) Если вы хотите использовать поддержку IIS в Visual Studio, которая позволяет вам создавать виртуальные каталоги IIS непосредственно в диалоговом окне New Web Site, вам нужно выбрать пункт «Совместимость управления IIS 6» в разделе «Средства управления веб-сайтом» (Web Management Tools --> IIS 6 Management Compatibility). Ok Убедитесь, что IIS активен: открыть localhost:80 в браузере. Ниже показана стандартная страница. Установить SQL Server и разрешить подключения Открыть Visual Studio с права администратора и создать виртуальный каталог для приложения: ПКМ по проекту --> Свойства --> Веб --> В разделе серверы выбрать "Локальный IIS" --> Нажать "Создать виртуальный каталог". Проект будет доступен по адресу указанному в графе URL-адрес проекта После написания кода собираем проект Ctrl+Shift+B и перезагружаем страницу в браузере. Для отладки Запускаем Visual Studio с правами администратора Жмем кнопку присоединиться (вверху на панельке, зеленая) Ставим галочку на "Показать процессы, запущенные всеми пользователями" Ищем процесс с названием "w3wp.exe" Жмем "Присоединиться"

Вставить текст в border CSS HTML

#css #html5 #text #background #border


Мне нужно вставить текст по центру в верхнюю и нижнюю  границу, которые будут иметь
фоновое изображение позади них. Это будет  на каждой странице. Я могу добиться этого
с помощью CSS?     

Пожалуйста, посмотрите скриншот того, что я имею в виду:     

    

Граница должна быть белого цвета, 3 пикселя в ширину, а шрифт - Basis Grotesque Medium.    

Я надеюсь начать с редактирования темы WordPress.    

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

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

Источник: Insert text in border CSS HTML
    


Ответы

Ответ 1



Добавлю свои 5 копеек... body { background-image: url(https://avatars.mds.yandex.net/get-pdb/1016956/27ec7a52-f169-49d8-b895-10a84386bb8b/s1200); background-repeat: no-repeat; } fieldset { border: 3px solid white; border-bottom: none; color: white; } fieldset+fieldset { transform: rotatex(180deg); } fieldset+fieldset>legend { transform: rotatex(180deg); } fieldset>p:last-child { margin-bottom: 0; }
Lorem

...content...

Ipsum


Ответ 2



Вы можете использовать тот подход, который я описал здесь - Line separator under text and transparent background - на линии слева/справа от названия. Затем вы можете использовать отрицательные поля top/bottom margin, и расположите их на нижней и верхней границах : @import url(http://fonts.googleapis.com/css?family=Open+Sans:300); body { background-image: url(https://avatars.mds.yandex.net/get-pdb/1016956/27ec7a52-f169-49d8-b895-10a84386bb8b/s1200); background-repeat: no-repeat; background-size: cover; font-family: 'Open Sans', sans-serif; color:#fff; } #content{ border:3px solid #fff; border-width:0 3px; display:inline-block; margin:50px 0; width:100%; } .divider { font-size:30px; margin: -0.65em auto -0.45em; overflow: hidden; text-align: center; line-height: 1.2em; } .divider:before, .divider:after { content: ""; vertical-align: top; display: inline-block; width: 50%; height: 0.65em; border-bottom: 3px solid #fff; margin: 0 2% 0 -55%; } .divider:after { margin: 0 -55% 0 2%; } p{margin: 150px 0;}

Top title

...Content here...

Bottom title

Обратите внимание, что top/bottom negative margins потребуют тонкую настройку семейства шрифтов, которые вы используете.

Логические операторы по книге о Питоне Марка Саммерфильда

#python


Всем привет. Читаю книгу по Питону Марка Саммерфильда. Не могу понять одну вещь,
касающуюся логических операторов (40-41 стр.). Почему в коде в IDLE такие результаты.
Какой тут принцип? И почему ни true, ни false выводится. Всем спасибо.

>>>> five = 5

>>>> two = 2

>>>> zero = 0

>>>> five and two

2
>>>> two and five

5
>>>> five and zero

0

    


Ответы

Ответ 1



Потому что Если у and оба операнда являются истиной, результатом будет последнее значение Соответственно у Вас нету значений 0, '', [], (), {} и None, которые являются ложью - значит оба операнда - истина. В последнем примере: Если какой-либо из операндов является ложью, результатом будет первое такое значение Источник Если же Вы всё таки хотите видеть True или False воспользуйтесь методом bool(two and five) bool documentation

Ответ 2



# left and right # вернет left, при bool(left) is False, иначе right # left or right # вернет right, при bool(left) is False, иначе left

Долгая загрузка сайта

#html #css #хостинг #оптимизация_сайтов


Сижу на хостинге, и у некоторых пользователей очень долгая загрузка сайта. 
Разбирались, и нашли почему такая проблема, но не нашли решения.

На сайт подключается стиль стандартным способом:




В стиле всего 79 строчек, но самую большую нагрузку в стилемов файле беру изображения:

background: url(../images/bg.jpg);


И вот каждая картинка грузит около 3-5 секунд (весом 900кб). 

Не понимаем, с чем связана эта проблема, у 95% пользователей все окей, а у остальных
5% - такая вот беда...

При прямом открытии картинки по URL, эту картинку грузит все равно те же 5 секунд,
а остальные - шустро (200мс в среднем).

В какую сторону стоит копать в такой ситуации? 
    


Ответы

Ответ 1



Я бы посоветовал вам оптимизировать весь статический контент на сайте. Сжатие графики В вашем случае кроме сжатия стилей и скриптов посоветую сжимать и графику. К примеру, картинки можно легко сжать без потери качества только за счет удаление 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/')) }); Оптимизация скриптов Сперва объедините все скрипты в один файл и минифицируйте их. Это помет сократить количество HTTP-запросов и размер файлов: var gulp = require('gulp'), concat = require('gulp-concat'), uglify = require('gulp-uglify'); // Concat JS gulp.task('js', function(){ gulp.src([ './js/jquery.js', './js/wow.js', './js/menu.js', './js/scrollspy.js', './js/main.js', './js/temp/contact.bundled.js', './js/owl.carousel.js' ]) .pipe(concat('script.js')) .pipe(uglify()) .pipe(gulp.dest('./public/js/')) }); Оптимизация стилей Кроме обычной минификации стилей можно использовать и продвинутую - объединять дубликаты классов и @media. Пример на gulp из моего [web-starter-kit][1]: var gulp = require('gulp'), stylus = require('gulp-stylus'), // Минифицирует CSS, объединяет классы. Не ломает CSS, в отличие от cssnano, который, к примеру, может неправильно выставлять z-index csso = require('gulp-csso'), // Объединяет все @media cmq = require('gulp-combine-mq'), // Сокращает CSS-селекторы gs = require('gulp-selectors'), // Проставляет вендорные префиксы autoprefixer = require('gulp-autoprefixer'), livereload = require('gulp-livereload'), nib = require('nib'); // Compiling Stylus in CSS gulp.task('css', function() { gulp.src('./styl/*.styl') .pipe(stylus({ use: nib() })) .pipe(cmq()) .pipe(csso()) .pipe(autoprefixer('last 3 versions')) .pipe(gulp.dest('./public/css/')) }); А если совсем делать нечего, то можно еще и селекторы сократить: // Minify selectors gulp.task('gs', function() { var ignores = { classes: ['active', 'menu', 'nav', 'slide', 'error', 'form-control', 'loader', 'showLoader', 'fadeLoader', 'webp', 'wow', 'owl-*', 'i-*'], ids: '*' }; gulp.src(['./public/**/*.css', './public/**/*.html']) .pipe(gs.run({}, ignores)) .pipe(gulp.dest('./public/')) }); Кстати, наверняка у вас есть классы, добавляющиеся через JS, поэтому предварительно стоит все такие классы вынести в переменную ignores. Кеширование статики на стороне пользователя Также бы посоветовал кешировать скрипты и стили на стороне пользователя, чтобы исключить их повторную загрузку, если они не изменились: Header set Cache-Control "max-age=2592000" И включить gzip сжатие на сервере: # сжатие text, html, javascript, css, xml: AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript

Ответ 2



Сами ответили на свой же вопрос. У одних хорошо, у других плохо. Зависит от скорости приёма клиентов, и от скорости отдачи веб-сервера. Чем дальше от сервера, тем хуже прием. Чем меньше скорость приёма, тем медленнее скорость загрузки. Принцип подгрузки больших элементов прост - сначала загружайте всё то, что сформирует страницу предельно быстро - основные стили, основной каркас, минимальные иконки. А вот большие уже элементы, к примеру Ваш фон, подгружайте отдельным стилем, к примеру асинхронно (jQuery), тогда и клиент быстрее увидит страницу, а там уже и картинки подгрузятся.

Приведение типов двумерного массива

#c_sharp


Есть массив 


  float[,] arr1;


Как его преобразовать в double[,]?
    


Ответы

Ответ 1



Если под «преобразовать» вы понимаете «создать новый массив», то так: double[,] Convert(float[,] arr) { int d0 = arr.GetLength(0), d1 = arr.GetLength(1); var result = new double[d0, d1]; for (int i0 = 0; i0 < d0; i0++) for (int i1 = 0; i1 < d1; i1++) result[i0, i1] = arr[i0, i1]; return result; } Если речь идёт о преобразовании типов «на месте», то, боюсь, никак.

Регулярное выражение для возврата первого (до пробела) слова строки

#c_sharp #регулярные_выражения #строки


Пробовал сделать вот так:

string pattern = @"^\s+";
Regex regex = new Regex(pattern, RegexOptions.Singleline);


но когда пытаюсь выполнить

 Match match = regex.Match("list command");


мне возвращает "".
    


Ответы

Ответ 1



Скорее всего, вы просто перепутали большую и маленькую S \s - это пробельный символ \S - это любой символ кроме пробельного, нужно написать так: ^\S+ или для верности: ^\S+\s

помогите разобратьсяс админкой на laravel 5.3

#php #laravel


Мне нужно сделать админку на laravel... Подключил sleepingowl 4!
Делаю по данному видеоуроку (https://www.youtube.com/watch?v=ca4zn71n4BI), по инструкции
с официального сайта совы ВСЕ данные повносил:
файл composer.json:

{...
   "require": {
           ...
           "laravelrus/sleepingowl": "4.*@dev"
  }
}


файл config/app.php:

 'providers' => [
           ...
           SleepingOwl\Admin\Providers\SleepingOwlServiceProvider::class,   
           App\Providers\AppServiceProvider::class,
           ...  ]


файл .env:

 DB_CONNECTION=mysql
 DB_HOST=127.0.0.1
 DB_DATABASE=laravel5
 DB_USERNAME=root
 DB_PASSWORD=root


Ввожу в адресную строку http://blog.laravel.com/admin (как сказано в официальных
доках http://sleepingowladmin.ru/docs/configuration) выдает:

Not Found

The requested URL /admin was not found on this server.
Apache/2.4.18 (Ubuntu) Server at blog.laravel.com Port 80


Логи апача говорят :

127.0.0.1 - - [21/Feb/2017:13:01:23 +0200] "GET /admin HTTP/1.1" 404 502 "-" "Mozilla/5.0
(X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0"


Помогите настроить админку!

Ссылка на Github:

 https://github.com/AlexBukreyev/blog.laravel

    


Ответы

Ответ 1



Все прекрасно, просто пропишите Route: /routes/web.php

Анимация заголовка вдоль края страницы

#javascript #jquery


В учебнике написана задача: 


  Создайте собственную анимацию.   Используйте setInterval для
  анимации заголовка h1, двигая его по квадрату вдоль краев страницы.


Текст двигаю вправо и вниз, а дальше никак, помогите начинающему



var leftOffset = 0;
var topOffset = 0;
 
var moveHeading = function () {
  $("#heading").offset({ 
    left: leftOffset,
    top: topOffset
  });
  leftOffset++;
  if (leftOffset > 200) {
    leftOffset = 200;

    topOffset++;
    if (topOffset > 200) {
      topOffset = 200;
    }
  } 
};


setInterval(moveHeading, 30)


 
 move


  

Привет, мир!


Ответы

Ответ 1



Вот работающий пример move

Привет, мир!



Ответ 2



У текста есть 4 состояния(направления движения), которые нужно переключать. Также, чтобы анимация выглядела равномерной, нужно высчитывать величину сдвига в зависимости от прошедшего времени. var start = Date.now(); // Время начала анимации var leftOffset = 0; // Начальное положение var topOffset = 0; var direction = 'r'; // Начальное направление var pixPerSec = 300; // Скорость анимации var leftLimit = $(document).width() - $('#heading').width(); // Границы, с учётом размера элемента(чтобы не появлялся скролл, или элемент не выходил за рамки документа) var topLimit = $(document).height() - $('#heading').height(); var moveHeading = function () { var now = Date.now(); // Текущее время var step = pixPerSec*(now - start) / 1e3; // На сколько пикселей нужно сдвинуть элемент // Сама анимация $("#heading").offset({ left: leftOffset, top: topOffset }); // Что делать дальше? switch (direction) { case 'r': // Прибавляем шаг в текущем направлении leftOffset += step; // Если достигли границы, if (leftOffset > leftLimit) { // Не даём элементы выйти за неё leftOffset = leftLimit; // Меняем направление direction = 'd'; } break; case 'd': topOffset += step; if (topOffset > topLimit) { topOffset = topLimit; direction = 'l'; } break; case 'l': leftOffset -= step; if (leftOffset < 0) { leftOffset = 0; direction = 'u'; } break; case 'u': topOffset -= step; if (topOffset < 0) { topOffset = 0; direction = 'r'; } break; } // Сбрасываем время на текущий момент start = now; }; setInterval(moveHeading, 30) h1{display: inline-block; margin: 0;} body{background-color: #eee;} move

Привет, мир!



Ответ 3



собственная анимация (квадрат)

Hello world



Вывод типа результата функции

#cpp #cpp14


Пытаюсь вывести тип результата одной функции и подставить его в аргумент другой +
добавить ссылку:

struct A {
    auto foo(int) const {
        return 42;
    }

    void bar(std::result_of_t& i) {}
};


Однако получаю много ошибок компиляции. Как сделать правильно для любого типа результата
(не только int)?
    


Ответы

Ответ 1



auto foo(int) const { return 42; } это уже сразу С++14, но не С++11. При этом дедукция типа auto будет выполнена только после завершения определения класса, по каковой причине определить возвращаемый тип foo внутри определения класса не получится (если не рассматривать внутренность тел методов). Если вы явно укажете тип auto foo(int) const -> int { return 42; } то будет работать void bar(std::result_of_t& i) {} Попытка сделать void bar(decltype(foo(int{}))>& i) {} не пройдет, потому что ссылаться на foo без объекта в этом месте запрещается. А "потенциальный" вариант void bar(decltype(std::declval().foo(int{}))>& i) {} не проходит из-за незавершенности типа A.

Переезд с mercurial на git

#git #mercurial #migration #hg


Здравствуйте!
Есть большая проблема с переездом на git.
Почему-то переезжает только одна ветка, а их полно...
Использую TortoiseHg с плагином hggit. В hgrc меняю только path.
Прошу помочь в этом вопросе.
    


Ответы

Ответ 1



Для пингвина лучше сделать вот так: Есть инструмент hg-fast-export. Его можно найти здесь: git clone http://repo.or.cz/r/fast-export.git /tmp/fast-export Нужно получить mercurial репу: hg clone /tmp/hg-repo Далее нужно создать файл соответствия авторов. cd /tmp/hg-repo hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors В /tmp/authors будет примерно следующее содержимое: bob bob@localhost bob bob jones company com> Bob Jones Joe Smith В примере выше, один и тот же человек (Боб) вносил изменения под пятью различными именами, лишь одно из которых правильное, а одно и вовсе не соответствует формату Git. hg-fast-export позволяет быстро исправить ситуацию, добавив ={new name and email address} к каждой строке, которую мы хотим изменить; чтобы оставить имя как есть, просто удалите нужные строки. Если же все имена выглядят хорошо, этот файл и вовсе не потребуется. В нашем примере мы хотим чтобы данные выглядели так: bob=Bob Jones bob@localhost=Bob Jones bob jones company com>=Bob Jones bob =Bob Jones Затем нужно создать Git репозиторий и запустить экспорт: git init /tmp/converted cd /tmp/converted /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authors Флаг -r указывает на подлежащий конвертации Mercurial репозиторий, а флаг -A задаёт файл с соответствиями между авторами. Скрипт пробегается по наборам изменений Mercurial и преобразует их в скрипт для fast-import в Git. И отправляем изменение в репу гита: git remote add origin git@my-git-server:myrepository.git git push origin --all Для винды почти так же только немного другие команды: cd c:\projects hg clone hg-repo git init converted git clone http://repo.or.cz/r/fast-export.git Отредактировать c:\projects\fast-export\hg-fast-export.py. Начало этого скрипта нужно заменить на такое: #!/usr/bin/env python # Copyright (c) 2007, 2008 Rocco Rutte and others. # License: MIT import sys # import mercurial libraries from zip: sys.path.append(r'C:\Program Files (x86)\Mercurial\library.zip') from mercurial import node from hg2git import setup_repo, fixup_user, get_branch, get_changeset from hg2git import load_cache, save_cache, get_git_sha1, set_default_branch, set_origin_name from optparse import OptionParser import re import os Скопировать fast-export в converted игнорируя .git папку. Далее: cd converted и создайте тут файл authors.txt по аналогии из linux версии. И hg-fast-export.sh -r c:\projects\hg-repo -A authors.txt Готово. Дальше можно заливать гит репу на сервер.

Зависает страница от большого количества <video>

#html #jquery


Ребят, добрый день! Нужна идея. Есть страница в которой находится такой список:

  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
  • Заголовок
Ещё есть кусочек Jquery: $(document).ready(function(){ $('video').hide(); }); $(".list-item").click(function() { $(this).next("video").slideToggle(1000); } ); Который позволяет кликнув по заголовку(элементу списка) развернуть находящееся под ним видео, и свернуть его, если оно уже развернуто. Этот список будет выводиться посредством php. Но проблема в том, что когда страница открывается, то браузер очень сильно виснет. Можно ли как-то оптимизировать все это? Я думал присваивать тегу video значение атрибута src, только после клика по заголовку, но не знаю как это сделать, ведь пути к файлам будут доставаться из Бд средствами php.


Ответы

Ответ 1



Надо изначально в php выводить видео с атрибутом display: none;

Потребление памяти PHP-генераторами

#php


В документации говорится:


  Генератор позволяет Вам писать код, использующий foreach для перебора набора данных
без необходимости создания массива в памяти, что может привести к превышению вами лимита
памяти, либо потребует довольно много времени для его создания. Вместо этого, Вы можете
написать функцию-генератор, которая, по сути, является обычной функцией, за исключением
того, что вместо возвращения единственного значения, генератор может yield столько
раз, сколько необходимо для генерации значений, позволяющих перебрать исходный набор
данных.
  
  Наглядным примером вышесказанного может послужить использование функции range()
как генератора. Стандартная функция range() должна генерировать массив, состоящий из
значений, и возвращать его, что может послужить результатом генерации огромных массивов:
например, вызов range(0, 1000000), приведёт к использованию более чем 100 МБ памяти.
  
  В качестве альтернативы мы можем создать генератор xrange(), который использует
память только для создания объекта Iterator и сохранения текущего состояния, что потребует
не больше 1 килобайта памяти.





  A generator allows you to write code that uses foreach to iterate over a set of
data without needing to build an array in memory, which may cause you to exceed a memory
limit, or require a considerable amount of processing time to generate. Instead, you
can write a generator function, which is the same as a normal function, except that
instead of returning once, a generator can yield as many times as it needs to in order
to provide the values to be iterated over.
  
  A simple example of this is to reimplement the range() function as a generator.
The standard range() function has to generate an array with every value in it and return
it, which can result in large arrays: for example, calling range(0, 1000000) will result
in well over 100 MB of memory being used.
  
  As an alternative, we can implement an xrange() generator, which will only ever
need enough memory to create an Iterator object and track the current state of the
generator internally, which turns out to be less than 1 kilobyte.




И приводится пример:

function xrange($start, $limit, $step = 1) {
    if ($start < $limit) {
        if ($step <= 0) {
            throw new LogicException('Step must be +ve');
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException('Step must be -ve');
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

/*
 * Note that both range() and xrange() result in the same
 * output below.
 */

echo 'Single digit odd numbers from range():  ';
foreach (range(1, 9, 2) as $number) {
    echo "$number ";
}
echo "\n";

echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}




Я увеличил количество генераций до 100000:


range(): https://repl.it/Fy4I;
xrange(): https://repl.it/Fy4K.


Результат мало чем отличается. Я полагал, что при использовании xrange() памяти должно
быть потреблено меньше. Почему так?
    


Ответы

Ответ 1



Потому, что вы забыли использовать результат Надо так: $a=range(0, 100000); 4474.390625 https://repl.it/Fy4I/1 Создался полный набор значений. $a=xrange(0, 100000); 377.7890625 https://repl.it/Fy4K/1 Извлечено только одно значение.

Прелоадер при отправке формы

#php #javascript #jquery #ajax


Добрый день, есть универсальная форма обратной связи, работает вот с этим скриптом:

$("form").submit(function() { //Change
    var th = $(this);
    $.ajax({
      type: "POST",
      url: "mail.php", //Change
      data: th.serialize()
    }).done(function() {
      location="http://mysite.com/thankyou.html";
    });
    return false;
  });`


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


Ответы

Ответ 1



Сделайте проще - используйте атрибут disabled, дабы пользователь видел сереющую кнопку и не только понимал, что никуда жать не надо, но и не мог нажать даже при очень большом желании. Собственно, можно изменять этот атрибут не только у кнопки отправки формы, но и у всей формы. Тогда вам будет достаточно прописать css-правила для элементов формы, которые будут изменять форму, и всем все будет понятно. Впрочем, скорее всего и без особых правил вас вполне устроит вид элементов формы, у которой установлен этот атрибут. Задизаблить все элементы ввода на форме можно примерно так: f.find(':input').attr("disabled", true); Где f - это указатель на вашу форму, если вы используете JQuery (а вы его используете). Отдельно кнопку, понятное дело, примерно так: b.attr("disabled", true); Можете, конечно, сделать и прелоадер, но проблем с ним огребете гораздо больше - нужно будет отдельно сделать его дизайн, потом отдельно сделать его для мобильных версий, потом окажется, что где-то он выглядит совсем не так, и не закрывает собой нужные элементы, и вы на всякий случай все равно будете их дизейблить, в общем сплошные проблемы. Если у вас вопрос еще и в том, где разместить упомянутый выше код, то в текущих версиях библиотеки запись $.ajax()такова (я привожу свою версию прелоадера, когда просто отключаем все элементы ввода): $.ajax({ url: u, type: 'POST', data: d, success: function () { // }, beforeSend: function () { // запускаем прелоадер f.find(':input').attr("disabled", true); }, complete: function () { // останавливаем прелоадер f.find(':input').attr("disabled", false); }, error: function () { // } }); Как несложно догадаться, один код в любом случае выполнится перед запуском, второй в любом случае - по окончанию, вне зависимости от успешности выполнения ajax-запроса (ну, если только ваш код в error или success ошибку исполнения быстрее не выдаст).

Регулярное выражение по HTML

#php #регулярные_выражения


У меня есть такой HTML-код:




Я составил для этого кода регулярное выражение:

\\\\\<\/div\>


Но оно, почему-то, пишет, что нет совпадений. Кто знает в чём дело?
    


Ответы

Ответ 1



Для манипуляций с HTML лучше пользоваться HTML-парсером. Вот пример использования PHP DomDocument для удаления определенных тегов вместе с их содержимым: $html = <<

Start

DATA; $dom = new DOMDocument('1.0', 'UTF-8'); // Инициализация DOMDocument $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // Заполнение структуры данными $xpath = new DOMXPath($dom); // Инициализация DOMXPath нашими данными $divs = $xpath->query('//div[@id="community_header" and @class="wcommunity_header"]'); // Запрос XPath foreach ($divs as $div) { $div->parentNode->removeChild($div); // Удаление найденных элементов } echo $dom->saveHTML(); См. демо этого кода. Запрос XPath означает: //div - найди все div, в которых [@id="community_header" - атрибутidравенcommunity_header` and - а также @class="wcommunity_header"] - атрибут class равен wcommunity_header.

Ответ 2



Не работает из-за того, что вот в этом месте \\< ^^^^ как и в других, потерялись перевод строки и пробельные символы. Следующая ошибка в жадном захвате: Скорее всего эта конструкция сожрёт всё до конца, так что так делать не надо. Как можно было бы попробовать: Все пробелы заменять на \s+ или \s*. Найти начало первого divа. Промотать в нём всё, что не связано с divами (?!]*)?>((?! получается ((?!]*)?>((?!)* Взять закрывывающий тег divа:
Целиком получается такая штука: ((?!]*)?>((?!)*
Чего-то, что прямо обязательно требовало бы экранирования нет. В php можно использовать любые ограничители для регулярных выражений, например #. В случае js надо экранировать слеши / и получится ((?!<\/?div\b)[\s\S]|]*)?>((?!<\/?div\b)[\s\S])*<\/div>)*<\/div> Попробуем (нужен браузер с поддержкой ES6): var pattern = /((?!<\/?div\b)[\s\S]|]*)?>((?!<\/?div\b)[\s\S])*<\/div>)*<\/div>/ig; console.log(`
Just a div
`.replace(pattern, "")); .as-console-wrapper.as-console-wrapper { top: 0; max-height: 100%; } Но вообще имеет смысл воспользоваться нормальным html-парсером.

Странное поведение ограничений в обобщенном методе

#c_sharp #net #ооп


Всем доброго времени суток. Может быть кто-то уже сталкивался с таким и может помочь? 

public static class JSON
    {
        public static string Serialize_object_TO_JSON(this T Entity)
         where T:ENT
        {
            return JsonConvert.SerializeObject(Entity);
        }

    }


Есть некий класс, который наследует ENT и передавать его в атрибуты можно. Дальше
мне пришлось переделать метод так, чтоб она работал с коллекциями:

public static class JSON
        {
            public static string Serialize_object_TO_JSON(this T Entity)
             where T:List
            {
                return JsonConvert.SerializeObject(Entity);
            }

        }


После чего компилятор говорит, что ему не удалось привести тип класса, который наследуется
от ENT, к типу List. 

P.S. Изначально задавать обобщение конечного класса я не могу, т.к. их довольно много,
именно по этому попытался делать через наследование.
    


Ответы

Ответ 1



Попробуйте так, если Вам это разрешает бизнес логика: public static class JSON { public static string Serialize_object_TO_JSON(this T Entity) where T : IEnumerable { return JsonConvert.SerializeObject(Entity); } } Дело в том что List - инвариантен. И все классы в .NET инвариантны. То есть это полное соответствие типов. Означает, что можно использовать только изначально заданный тип. Таким образом, параметр инвариантного универсального типа не является ни ковариантным, ни контравариантным. С другой стороны есть IEnumerable где тип-параметр T помечен как out - ковариантным. Позволяет использовать тип с большей глубиной наследования, чем задано изначально. Полное описание почему так +1 за хороший пример

Рандом в крестиках ноликах

#javascript #jquery


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

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



$(function() {
  var bot = function() {
    var cell = Math.floor(Math.random() * (10 - 1)) + 1;
    
    if( $('.board-cell').eq(cell).text() == '' ) $('.board-cell').eq(cell).text( 'O' );
  };

  $('.board-cell').click(function() {
    if( $(this).text() == '' ){
      $(this).text( 'X' );
      bot();
    };
  });
});
.board {
  display: flex;
  flex-wrap: wrap;
  width: 153px;
  height: 153px;
  border-left: 1px solid black;
  border-top: 1px solid black;
}

.board-cell {
  width: 50px;
  height: 50px;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
  cursor: pointer;
}



Ответы

Ответ 1



Можно так: $(function() { function bot() { var $cells = $('.board-cell:empty'); var i = Math.floor(Math.random() * $cells.length); $cells.eq(i).text( 'O' ); }; $('.board-cell').click(function() { if( $(this).text() == '' ){ $(this).text( 'X' ); bot(); }; }); }); .board { display: flex; flex-wrap: wrap; width: 153px; height: 153px; border-left: 1px solid black; border-top: 1px solid black; } .board-cell { width: 50px; height: 50px; border-right: 1px solid black; border-bottom: 1px solid black; cursor: pointer; }


Ответ 2



Я бы сделал, что если найден повтор, то снова запускать функцию bot и так до тех пор, пока не будет пустая ячейка. Так же нужно добавить переменную, что бы конце не создалась вечная функция $(function() { var c = 0; var bot = function() { var cell = Math.floor(Math.random() * (9 - 1)) + 1; if( $('.board-cell').eq(cell).text() === '' ){ $('.board-cell').eq(cell).text( 'O' ); c++; }else{ if(c !== 9){ bot(); }; }; }; $('.board-cell').click(function() { if( $(this).text() == '' ){ $(this).text( 'X' ); c++; bot(); }; }); }); .board { display: flex; flex-wrap: wrap; width: 153px; height: 153px; border-left: 1px solid black; border-top: 1px solid black; } .board-cell { width: 50px; height: 50px; border-right: 1px solid black; border-bottom: 1px solid black; cursor: pointer; }
И я немного ваш рандом переделал, изменив максимальное число на "9"

await Task не содержит определение Delay

#c_sharp #async_await


using System.Threading.Tasks;

private async Task PageLoad(int TimeOut)
{
    TaskCompletionSource PageLoaded = null;
    PageLoaded = new TaskCompletionSource();
    int TimeElapsed = 0;
    _webBrowser.DocumentCompleted += (s, e) =>
    {
        if (_webBrowser.ReadyState != WebBrowserReadyState.Complete) return;
        if (PageLoaded.Task.IsCompleted) return; PageLoaded.SetResult(true);
    };

    while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
    {
        TimeElapsed++;
        if (TimeElapsed >= TimeOut * 100) PageLoaded.TrySetResult(true);
        await Task.Delay(10);
    }
}


Почему VS пишет что Task не содержит определение для Dеlay? Вроде для ее работы нужна
только System.Threading.Tasks или опять что-то поменялось?
    


Ответы

Ответ 1



Task.Delay доступен с версии .NET Framework 4.5. Есть аналог для .NET Framework 4 в реализации Microsoft Async использовать так: await TaskEx.Delay(1000);

Ошибка: play() can only be initiated by a user gesture (мобильный Chrome)

#google_chrome #mobile #мобильная_разработка #ionic


Делаем приложение через Ionic/Cordova; компилю на платформу browser; через библиотeку
медиа пытаюсь запустить мелодию по событию (пришел заказ от клиента).

Столкнулся с такой проблемой: если PUSH работает нормально, то на попытку инициализировать
звук когда открыто приложение через мобильный хром — ну ни как не получается. Вылетает
такая ошибка:


  Uncaught (in promise) DOMException: play() can only be initiated by a
  user gesture.


И да, я читал, что это такое и немного вот об этом и этом.

Понаходил советы, что нужно вызов проигрывания цеплять на click или другой жест.
Но, при всех прочих, захожу в ВК с мобильного браузера, смотрю на страницу — мне присылают
сообщение, и звук идёт (не от PUSH, а от браузера)!

Вопрос: как у них это получилось? И как мне сделать такое же (хотя бы в теории)?
Буду рад любым идеям. Спасибо.
    


Ответы

Ответ 1



function initAudioItems(e) { if (e.originalEvent !== undefined) { var dom_item = document.getElementById('my_audio'); dom_item.muted = true; dom_item.play() .catch(function(e) { console.log(e); }); dom_item.pause(); dom_item.muted = false; $(dom_item).data('init', true); $('body').off('click', initAudioItems); } } // init audio $('body').on('click', initAudioItems); Если пользователь хоть раз кликнет на странице - аудио беззвучно запустится и остановится. После этого вы можете запускать его по произвольному событию. Как ни старался не смог найти как такую инициализацию повесить на пролистывание, только на клик работает.

Ответ 2



Вы на полпути к решению, осталась только одна деталь - сохранение дом элемента audio для повторного использования. Этот объект достаточно инициализировать лишь один раз в контексте пользовательского действия (нажатие или даже пролистывание), а затем использовать его везде где нужно запустить воспроизведение по произвольному событию. Естественно на сайтах-одностраничниках такой "фокус" работает просто на ура, но не будет работать на сайтах которые перезагружают страницу полностью. А также этот элемент после инициализации можно перемещать в DOM документа Все вышесказанное относится как к сайту так и к приложению. Знаю что есть опция в настройках cordova разрешающая автовоспоизведение без взаимодействия с пользователем, но к сожалению она не на всех версиях android работает так как должна.

Обработка событий в datalist

#javascript #html #jquery #css


Доброго времени суток. 
Столкнулся с такой проблемой. У меня есть input поле с datalist списком. Мне необходимо,
что бы при нажатии на элемент из datalist, происходило какое-либо событие. Тот же alert,
хотя бы. $().change работает, когда поле выходит из фокуса, а нужно, что бы сразу при
нажатии. Такое возможно?


    
        
        
        
    

    


Ответы

Ответ 1



Событие input срабатывает тут же при изменении значения текстового элемента и поддерживается всеми браузерами, кроме IE8-. $('#test_input').on('input', function() { console.log($(this).val()); })

Не могу получить популярные аудиозаписи VK

#android #vkontakte_api #аудио


получаю токен юзера и сразу пытаюсь получить 

VKRequest audios = VKApi.audio().getPopular();


И получаю error 15 :( Читал, что сторонние разработчики не могут работать с аудио
но как же тогда работает это  

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


Ответы

Ответ 1



PROFIT! Я это сделал! Декомпилировал одно приложение и узнал какой сейчас используется хак. main.xml MainActivity.java public class MainActivity extends Activity { public class VkontakteWebViewClient extends WebViewClient { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); MainActivity.this.parseUrl(url); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView kateWV = (WebView)findViewById(R.id.kateWebView); kateWV.getSettings().setJavaScriptEnabled(true); kateWV.clearCache(true); kateWV.setWebViewClient(new VkontakteWebViewClient()); CookieSyncManager.createInstance(this); CookieManager.getInstance().removeAllCookie(); kateWV.loadUrl(Auth.getUrl("2685278", Auth.getSettings())); } public void parseUrl(String url){ if (url != null) { try { if (url.startsWith(Auth.redirect_url)) { if (!url.contains("error=")) { String[] auth = Auth.parseRedirectUrl(url); saveTokenToSharedPreferences(getApplicationContext(), Auth.VK_SDK_ACCESS, "scope=groups,audio,offline&https_required=1&expires_in=0&access_token=" + auth[0] + "&user_id=" + Long.parseLong(auth[1])); } startActivity(new Intent(MainActivity.this, AudioActivity.class)); finish(); } } catch (Exception e) { e.printStackTrace(); } } } public void saveTokenToSharedPreferences(Context ctx, String tokenKey, String code) { SharedPreferences.Editor edit = PreferenceManager.getDefaultSharedPreferences(ctx).edit(); edit.putString(tokenKey, code); edit.apply(); } } Auth.java public class Auth { public static final String VK_SDK_ACCESS = "VK_SDK_ACCESS_TOKEN_PLEASE_DONT_TOUCH"; public static String redirect_url; static { redirect_url = "https://oauth.vk.com/blank.html"; } public static String getUrl(String api_id, String settings) { return "https://oauth.vk.com/authorize?client_id=" + api_id + "&display=mobile&scope=" + settings + "&redirect_uri=" + URLEncoder.encode(redirect_url) + "&response_type=token" + "&v=" + "5.53"; } public static String getSettings() { return "notify,friends,photos,audio,video,docs,status,notes,pages,wall,groups,messages,offline,notifications"; } public static String[] parseRedirectUrl(String url) throws Exception { String access_token = Utils.extractPattern(url, "access_token=(.*?)&"); String user_id = Utils.extractPattern(url, "user_id=(\\d*)"); if (user_id == null || user_id.length() == 0 || access_token == null || access_token.length() == 0) { throw new Exception("Failed to parse redirect url " + url); } return new String[]{access_token, user_id}; } } В итоге после авторизации через WebView в preferences будет сохранен токен scope=groups,audio,offline&https_required=1&expires_in=0&access_token=тут_токен_юзера&user_id=тут_id_юзера Далее можно работать с API VK. Лично у меня происходит переход в AudioActivity. Примерный код VKRequest request = VkApi.audio().getPopular(); request.executeWithListener(new VKRequest.VKRequestListener() { @Override public void onComplete(VKResponse response) { //выводим json с музыкой в логи Log.d("vkmusic", response.responseString); } @Override public void onError(VKError error){ Log.d("err", error.toString()); } }); request.start(); Ну и все, можно юзать. Результат

Ответ 2



И вот еще класс Utils class Utils { public static String extractPattern(String string, String pattern) { Pattern searchPattern = Pattern.compile(pattern); Matcher matcher = searchPattern.matcher(string); Log.d("pattern found - ", matcher.find() ? ("yes" + matcher.group(1)) : "no"); return matcher.group(1); } }

Угол под 45 градусов у div

#html #css #css3 #internet_explorer #clip_path


Друзья, может кто-то сталкивался с подобной задачей...
Необходимо у div срезать углы (верхний-левый и нижний правый), под углом 45 градусов.

реализовал через clip-path

    .corner45top {
    -webkit-clip-path: polygon(5% -200%, 100% 0%, 100% 100%, 0% 100%, 0% 100%, 0% 100%);
    clip-path: polygon(5% -200%, 100% 0%, 100% 100%, 0% 100%, 0% 100%, 0% 100%);
    clip-path: url("#swipe__clip-path");
    background-color: #FFFFFF;
    box-shadow: 0 1px 6px 0 rgba(86,86,86,0.25);
}

.corner45bottom {
    -webkit-clip-path: polygon(0 -100%, 100% 0%, 98% 100%, 0% 100%, 0% 100%, 0% 100%);
    clip-path: polygon(0 -100%, 100% 0%, 98% 100%, 0% 100%, 0% 100%, 0% 100%);
    clip-path: url("#swipe__clip-path-bottom");
    background-color: #FFFFFF;
    box-shadow: 0 1px 0 0 rgba(86,86,86,0.25);
}


    
        
            
        
     

   
    
        
            
        
     



Но все эти "красивости" никак не работают в браузере EDGE, есть ли какой-то простой
вариант вылечить это?
Мог бы сделать углы например картинкой, но за блоками есть background-image цветной(
    


Ответы

Ответ 1



Для этого нам на помощь приходит SVG , подходит такой вариант ?

Ответ 2



Делаем маску с помощью overflow:hidden. Угол получаем поворотом элемента на 45 градусов transform:rotate(-45deg) (внутренний элемент вертим обратно, чтобы был ровно). С помощью отступов margin регулируем глубину среза. .container{ transform:rotate(-45deg); overflow:hidden; height: 160px; margin-top: -30px; } .inside{ transform:rotate(45deg); background:#090; height:100px; width:200px; margin:30px auto; }
Тестовый блок


Как в C++ использовать код на Go?

#cpp #golang


Добрый день! Подскажите, как использовать функции из Go в программе на C++? Буду
благодарен за простой и доступный пример.
    


Ответы

Ответ 1



Файл hello.go: package main import "fmt" import "C" //export Hello func Hello() { fmt.Println("Hello, world!") } func main() {} Файл main.cpp: #include "hello.h" int main(void) { Hello(); return 0; } Команды: $ go build -buildmode c-archive hello.go $ clang++ -lpthread -o main main.cpp hello.a Результат: $ ./main Hello, world! Подробности тут и там.

Применение CSS-свойств к элеметам внутри определенного div

#html #css


На странице есть список внутри div, выглядящий примерно так:

  1. ...
Мне необходимо кастомизировать такой список, если он содержится в таком div, примерно таким способом: ol { ... } ol li { ... } ol li:before { ... } Как правильно описать это в файле стилей?


Ответы

Ответ 1



Используйте в селекторе класс .wiki-content. Выглядеть это будет так: .wiki-content ol { // Ваши стили } .wiki-content li { // Ваши стили } .wiki-content li:before { // Ваши стили } Если у вас используется препроцессор, к примеру Less, можно сделать еще проще: .wiki-content { ol { // Ваши стили } li { // Ваши стили &:before { // Ваши стили } } }

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

#cpp


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


Ответы

Ответ 1



Применять set или unordered_set для небольших наборов - палить из пушки по воробьям. Кстати, вопрос сравнения методов выделения уникальных записей (правда, не для строк) уже поднимался и рассматривался здесь. Здесь эффективнее записать все указатели на слова в массив, отсортировать и вернуть уникальные, что-то вроде int main() { const char * delimeters = " \t,."; // Решите сами, что вам нужно char s[] = "aaa bbb ccc ddd aaa ddd ccc ggg"; vector ptrs; for(char* w = strtok(s,delimeters); w; w = strtok(nullptr,delimeters)) ptrs.push_back(w); sort(ptrs.begin(), ptrs.end(), [](const char* a,const char* b){ return strcmp(a,b) < 0; }); cout << distance(ptrs.begin(), unique(ptrs.begin(),ptrs.end(), [](const char* a,const char* b){ return strcmp(a,b) == 0; })) << endl; } Но, как я понимаю, сейчас ваши преподы требуют от вас простых решений, не использующих все эти премудрости с STL. Например, такие: int main() { const char * delimeters = " \t,."; // Решите сами, что вам нужно char s[] = "aaa bbb ccc ddd aaa ddd ccc ggg"; char * words[50]; // Ну, заведомо больше, чем слов... int n = 0; for(char* w = strtok(s,delimeters); w; w = strtok(nullptr,delimeters)) words[n++] = w; int count = 0; for(int i = 0; i < n; ++i) { ++count; for(int j = 0; j < i; ++j) if (strcmp(words[i],words[j]) == 0) { --count; break; } } cout << count << endl; } При небольших наборах слов работать будет очень быстро...

Ответ 2



Наивная реализация может выглядеть как-то так: char arr[] = "aaa bbb,aa, bbb\ta aa bb"; //исходный массив со словами unordered_set uniqWords;//сюда будем вставлять слова - set это такой контейнер, который хранит только уникальные значения char *token = strtok(arr, " \t,.:;\r\n!?"); //начинаем разбивку на токены: слова могут разделяться пробелами, табуляцией, знаками препинания while (token != NULL) { uniqWords.insert(token); token = strtok(NULL, " "); } //выводим кол-во уникальных cout << "Unique words = " << uniqWords.size() << '\n'; Полный пример можно запустить здесь

Реализация прироста ресурсов в реал-тайме в браузерной (мобильной) ММО стратегии

#разработка_игр


Как реализуют игровую механику в браузерных или мобильных ММО стратегий, на подобии
марш империй, vikings, ikariam и.т.д, а точнее как им удается осуществлять прирост
ресурсов в реал-тайме? Сервер запускается и обрабатывает каждую учетную запись прибавляя
рассчитанное количество ресурсов в цикле каждую секунду?
    


Ответы

Ответ 1



Могу предположить, что данные о приросте в секунду у каждого пользователя для каждого ресурса хранятся на их серверах. Сервера мониторят последние таймстэмпы пользователей (от последнего совершенного действия, связанного с ресурсами, например, их трата, или заход\выход из приложения). Рассчитывается все по формуле (currentTimestamp - lastTimestamp) * RPS (Resources Per Second), а затем все это записывается в БД А если пользователь находится в сессии постоянно, то этот прирост ресурсов просто "рисуется". И когда юзер начинает с ними какое-то действие (Например, купил что-то и они потратились), сервер добавляет к прошлому значению ресурсов новые (по вышеупомянутой формуле) и уже изменяет значение ресурсов (Вычитает, или добавляет) и сохраняет в БД. Соот-но lastTimestamp присваивается currentTimestamp и так до следующего действия

Утечка памяти в TObjectList

#delphi


Не могу найти решение для устранении утечки.



type
  TMyObj = class
  Caption: string;
  Description: string;
  Params:string;
  ParamsLst: TStringList;

public
  constructor Create(const aPath: string; const aParams: TStrings); overload;
  destructor Destroy(); override;
end;

TDataList = class(TObjectList)
public
  constructor Create;
  // function LoadFromINI(IniFile: TMemIniFile): boolean;
  function Remove(Obj: TMyObj): Integer;
end;

var
  TObjData: TDataList;

implementation

constructor TMyObj.Create(const aPath: string; const aParams: TStrings);
begin
  Caption := aParams.Values['Caption'];
  Description := aParams.Values['Description'];
  Params := aParams.Values['Params'];
  if aParams.Values['Params'] <> '' then
  begin
    ParamsLst := TStringList.Create;
    try
      ExtractStrings([';', ','], [' '], PChar(Params), ParamsLst);
    except
      ParamsLst := nil;
    end;
  end;
end;

destructor TMyObj.Destroy;
begin
  ParamsLst.Free;
  inherited;
end;

constructor TDataList.Create;
begin
  inherited Create;
  OwnsObjects := True;
end;

function TDataList.Remove(Obj: TMyObj): Integer;
begin
  Result := inherited Remove(Obj);
end;

initialization
TObjData := TDataList.Create;

finalization
TObjData.Free;


заполнение TObjData, так

    TObjData.Add(TMyObj.Create(sVal, SecParams));

    


Ответы

Ответ 1



Что касается исключения - точное место создания объекта, который не уничтожился может показать FastMM или EurekaLog. Приведенный код рабочий и в большинстве случаев все правильно освобождается. (Нюансы описал ниже.) Скорее всего вы создается TreeList и его не уничтожаете (либо ждете что его уничтожит родительский объект, а он не назначен). Остальные нюансы: Может я что то упустил, но я не вижу откуда берутся данные для заполнения SecParams. Если вы до момента добавления создали SecParams - его нужно уничтожить. Иначе будет утечка. TObjData.Add(TMyObj.Create(sVal, SecParams)); Второй участок try..except. При возникновении исключения - объект все же не уничтожится. ParamsLst := TStringList.Create; try ExtractStrings([';', ','], [' '], PChar(Params), ParamsLst); except ParamsLst := nil; // end; Хотя тоже не ясно, ну не обработались параметры, значит они в неправильном формате - объект создастся, но с пустым параметром ParamsLst. И если к нему обратится без проверки - будет Access Violation. TObjData - есть общие правила когда с буквы T начинаются описания типов. F - для внутренних полей класса. var TObjData: TDataList; Для полей класса TMyObj нужно явно указать идентификатор видимости (private, public), а еще лучше перенести их в секцию private и дать доступ к полям с помощью свойств. Например: type TMyObj = class FCaption: string; public ... property Caption: string read FCaption; end; TMyObj - название класса должно описывать объект. (Например: TPerson)

Ответ 2



В коде нет ни одного момента заполнения переменной со странным именем TObjData. Но могу предположить, что OwnsObjects не правильно срабатывает. В финализации перед разрушением объекта TObjData лучше сделать цикл проверки вложенных в него объектов и выяснения по какой причине они не освобождаются до финализации.

Ответ 3



Код с учетом замечаний и предложений...... type TData = class private FCaption: string; FDescription: string; FParams: string; FParamsLst: TStringList; //.... public constructor Create(const aPath: string; const aParams: TStrings); destructor Destroy(); override; property Caption: string read FCaption; property Description: string read FDescription; property Params: string read FParams; property ParamsLst: TStringList read FParamsLst; //... end; TDataList = class(TObjectList) private //... public constructor Create; destructor Destroy(); override; property //... end; var DataList: TDataList; implementation { TData } constructor TData.Create(const sPath: string; const sData: TStrings); begin Caption := aParams.Values['..']; Description := aParams.Values['..']; Params := aParams.Values['..']; if aParams.Values['..'] <> '' then begin ParamsLst := TStringList.Create; try ExtractStrings([','], [' '], PChar(Params), ParamsLst); except on E: Exception do ShowMessage(E.ClassName + ': ' + E.Message); end; end; end; destructor TData.Destroy; begin inherited; end; { end TData } { DataList } constructor TDataList.Create; begin inherited Create; OwnsObjects := True; end; destructor TDataList.Destroy; begin inherited; end; { end DataList } Решение, проблемы ...... procedure TMain.FormDestroy(Sender: TObject); var I: Integer; begin // Удаление списков в объекте for i := 0 to DataList.Count - 1 do begin with DataList.Items[i] do begin ParamsLst.Free; end; end; // При удалении списка оставшиеся в нём объекты будут удалены. FreeAndNil(DataList); end;

Где хранить нетипичные файлы

#yii2 #yii


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


Ответы

Ответ 1



Хранить кастомный файл можно где угодно. Нужно всего лишь работать с пространствами имен и подключать где нужно. Для примера создадим файл Person.php в папке helpers в корневой директории проекта. namespace app\helpers; //Указываем пространство имен для подключения в будущем class Person { public static function showName($name) { return "Привет $name"; } } Для того чтобы подключить выше созданный класс нужно сделать следующее: use app\helpers\Person; //используем пространства имен echo Person::showName("Urmuz"); //Используем статичный метод класса Person

Ответ 2



Смотря что там за функции. Можно оформить как behavior или как trait или это helper. Можно вынести на github и подключать через компосер, соответственно попадет в vendor или же закинуть в common в зависимости common/behavior common/trait common/helpers

Несколько результатов из БД, с учётом сортировки

#mysql #sql #база_данных #select #выборка


Имеется таблица book в которой около 50 записей.
Поля таблицы id(int),name(varchar),path(text),lang(int, value = 1,2,3).
lang=1 примерно 18 записей
lang=2 примерно 16 записей
lang=3 примерно 16 записей
Необходимо составить sql запрос, чтобы выбрать 3 книги, первая из которых это случайное
число из первых 18 записей, второе это тоже случайное число из вторых 16 записей, и
третья соответственно тоже случайное число из последних 16 записей

Что то на подобие такого: 
SELECT * FROM book 
            WHERE lang=1 ORDER BY RAND () LIMIT 1 
                                               AND 
            WHERE lang=2 ORDER BY RAND () LIMIT 1
                                               AND 
            WHERE lang=3 ORDER BY RAND () LIMIT 1;
    


Ответы

Ответ 1



Для ваших объемов данных подойдет очень простой запрос: SELECT random_book.* FROM book LEFT JOIN (SELECT * FROM book ORDER BY RAND()) random_book ON (book.lang = random_book.lang) GROUP BY random_book.lang ORDER BY RAND() - это не быстро на больших обьемах данных.

Ответ 2



Для ваших объемов: SELECT * FROM book WHERE lang=1 ORDER BY RAND() LIMIT 1 UNION SELECT * FROM book WHERE lang=2 ORDER BY RAND() LIMIT 1 UNION SELECT * FROM book WHERE lang=3 ORDER BY RAND() LIMIT 1 Для больших объемов используйте min(id), max(id), rand() и математику в where - будет без order by rand

Начальная страница браузера

#php #javascript #html #css #веб_программирование


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

просто, красиво.
Хотелось бы для своего сайта, сделать красивое оформление на начальной странице.
Но если честно я даже не представляю пока как запрос в гугл подать)) Подскажите куда
рыть или, если не лень, то может на примере на простом объясните.
    


Ответы

Ответ 1



Гуглить, наверное, так: express panel preview. Хотя меня несколько настораживает, что результаты довольно старые. В https://habrahabr.ru/post/115705 говорится Можно просто добавить иконку размером не меньше чем 114*114: Использовать медиа-запрос с view-mode: @media screen and (view-mode: minimized) { /* some styling of preview */ } Ответить на http-запрос, содержащий заголовок X-Purpose: preview соответствующим содержимым.

C#. Как преобразовать число с плавающей точкой в аналогичное число, но только с заданным количеством знаков после запятой?

#c_sharp #net #double


Доброго времени суток! 

Возник следующий вопрос: к примеру, у нас есть переменная типа double и некоторая
точность (переменная precition), которая будет определять количество интересующих нас
знаков после запятой:

    double x = 9.3813020199999;
    double precition = 0.001;


Зная вышеперечисленные данные, нам нужно получить точное число 9.381 (и без лишних
нулей в конце). Есть ли способ это осуществить?

UPD Мне необходимо протестировать метод Sqrt (код ниже) и я не знаю, как правильно
написать тест для NUnit, если метод возвращает число double. Ведь у нас должно быть
expected-значение, которое сравнивается с возвращаемым значением метода.

    public static double Sqrt(double x, int n, double precition)
    {
        if (x < 0 && n % 2 == 0)
            throw new ArgumentException();

        double result = x / n;
        double previousResult;
        do
        {
            previousResult = result;
            result = ((double)1 / n) * ((n - 1) * previousResult + (x / Sqr(previousResult,
n - 1)));
        }
        while (Math.Abs(result - previousResult) > precition);

        return result;
    }


Пока мой тестирующий метод, написанный с помощью NUnit, выглядит так:

    [TestFixture]
    public class NewtonSqrtTests
    {
        [TestCase(4, 2, 0.001, ExpectedResult = 2.000)]
        [TestCase(27, 3, 0.0001, ExpectedResult = 3.0000)]
        [TestCase(88, 2, 0.001, ExpectedResult = 9.380)]
        [TestCase(81, 2, 0.001, ExpectedResult = 9.000)]
        public double Sqrt_PositiveTest(double x, int n, double precition)
        {
            return NewtonSqrt.Sqrt(x, n, precition);
        }
    }

    


Ответы

Ответ 1



Если говорить о десятичных знаках, то оставаться в рамках типа double бессмысленно: в нём вы не можете выразить вашу требуемую точность точно. Например, потому, что в типе double нельзя точно выразить ни число 0.001, ни число 9.381. (иллюстрация, связанный ответ) Вам нужно перейти к типу decimal, который специально для этого предназначен. double x = 9.3813020199999; decimal precision = 0.001m; decimal result = Math.Round((decimal)x / precision) * precision; // 9.381 Если количество десятичных знаков известно в виде числа, можно проще: double x = 9.3813020199999; decimal result = Math.Round((decimal)x, 3); // 9.381 Обновление: Если оставаться в рамках типа double, вы не можете их сравнивать: равенство теоретически одинаковых чисел типа double, вычисленных разными путями — практически невероятное событие из-за ошибок округления. В таких случаях используется примерное равенство с точностью до epsilon. Например, в NUnit есть для таких целей специальные функции: Values of type float and double are normally compared using a tolerance specified by the Within modifier.

C# Получить объект вызвавший getter свойства

#c_sharp #wpf


Здравствуйте!
У меня возникла проблема "красивого" способа изменения настроек "на лету". 
Наример:

private string _text;
public string SampleTextProp
{
    get
    {
        return _text;
    }

    set
    {
        _text = value;
    }
}

textBlock1.Text = SampleTextProp;


И вопрос:
Есть ли возможность внутри геттера SampleTextProp получить объект textBlock1.Text,
чтобы позже использовать его? В сеттере например.
То есть мне нужно получить объект, который вызвал геттер.
Надеюсь я понятно выразился...

Спасибо большое!


Update: Для чего мне это нужно.
Есть класс хранящий в себе настройки для приложения представленные как свойства.
По мере написания программы я применяю эти свойства к различным полям или свойствам
других объектов. Но эти настройки будут применяться только при запуске программы, а
мне надо видеть изменения во время исполнения. В тоже время я не хочу вручную связывать
настройку и объект применяющий её (windowBorder.BorderThickness = Settings.Interface.BorderThickness.GetValue(windowBorder)
или как-то так) 
Я хотел чтобы можно было просто вызвать свойство и всё. А класс его описывающий самостоятельно
получил бы вызывающий объект, запомнил, и при последующем изменении свойства, автоматически
применил новое значение ко всем ранее вызывавшим это свойство объектам. Фух
    


Ответы

Ответ 1



То, что вам нужно, называется "дата-биндинг" (data binding, по русски - привязка данных) и идет рука об руку с шаблоном проектирования MVVM (Model - View - View Model). Для WinForms это делается через вкладку свойств, далее - пункт (ApplicationSettings) для привязки настроек или пункт (DataBindings) для привязки источника данных. В WPF это делается через указание в разметке конструкции {Binding}: BorderThickness="{Binding BorderThickness, Source={x:Static Settings.Default}}" Если вы используете не стандартный класс настроек, а пишите свой - не забудьте реализовать интерфейс INotifyPropertyChanged

Ответ 2



Нет. Никак нельзя. При присвоении значения в любую пропертю ты передаешь ЛИШЬ значение проперти. Но ты можешь написать метод который бы сразу обьект и из него доставал бы текст,если для тебя это важно.

Как в Android Studio у существующего проекта поднять версию ОС устройства?

#android #android_studio


Добрый день, пишу в Android Studio под версию устройства Android 4 как можно в этом
же проекте поднять версию до Android 6 ?  
    


Ответы

Ответ 1



Если имеется в виду минимальная поддерживаемая версия ОС, то укажите её в build.gradle (module app). Вам требуется изменить значение переменной minSdkVersion в блоке defaultConfig на 23

“Сапёр”. Алгоритм поиска соседних клеток, не содержащих мин или цифр

#javascript #алгоритм


Стандартный "сапер". Поле 16 на 16 клеток. 20 мин на поле.

При первом нажатии игрок заведомо не попадает на клетку с миной. Он попадает либо
на пустую клетку, либо на клетку, содержащую информацию о количестве мин вокруг. Назовем
ее клеткой с цифрой. 

Если игрок кликнул на клетку с цифрой - открываем только ее. Если игрок кликнул на
полностью пустую клетку, то кроме этой самой клетки требуется открыть все (related,
не могу перевод подобрать. Соединенные что ли) клетки включая те, которые содержат
в себе цифру, но не дальше их. Что-то типа такого:



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

Собственно, интересует алгоритм поиска этих самых фиолетовых клеток.
Также, если есть какие-то тонкости реализации именно относительно JavaScript, то
тоже буду рад выслушать.
    


Ответы

Ответ 1



Самый простой алгоритм: Если клетка пустая, проверить соседние клетки: слева, справа, сверху, снизу стоит обратить внимание на граничные случаю, как в примере в вопросе, когда нет клетки справа и снизу. Если не пустая - ничего не делать. Псевдокод функция Проверить ячейку (ячейка) если ячейка проверерена -> выход если ячейка не пустая -> выход Отметить, что ячейка проверена, чтобы не проверять дважды. Проверить ячейку сверху если есть Проверить ячейку снизу если есть Проверить ячейку слева если есть Проверить ячейку справа если есть конец функции Вариант без рекурсии: функция Проверить ячейку (ячейку) если ячейка не пустая -> выход получить ячейки для проверки <- [ ячейка сверху если есть ячейка снизу если есть ячейка слева если есть ячейка справа если есть ] // смежные Пока есть ячейки для проверки: если текущая ячейка пустая и не проверенная, то отметить ячейку как проверенную. удалить ее из списка ячеек для проверки. добавить в список ячеек для проверки смежные не проверенные ячейки конец функции

Ответ 2



допустим есть nums(point) - возвращает 0 на фиолетовых и >0 на остальных. допустим есть dist(pointA, pointB) - (float) возвращает расстояние между клеточками. допустим есть closedPoints - это массив ещё не открытых клеточек // для волн сбора фиолетовых клеток до кучи function nearestPinc(pointA, openList) { function okDist(pointB) { return dist(pointA, pointB) == 1; } // клетка пустая(фиолетовая) и она близка к pointA if (nums(pointA) == 0 && openList.find(okDist)) { openList.push(pointA); } return openList; } // для последней волны сбора жёлтых клеток function nearestYellow(pointA, openList) { function okDist(pointB) { return dist(pointA, pointB) < 2; } // клетка близка к pointA if (openList.find(okDist)) { openList.push(pointA); } return openList; } function getOpenList(point) { let openList = [point]; if (nums(point) > 0) // ткнули в жёлтую return openList; // собираем все повязанные фиолетовые клеточки let L = openList.length; // пока находим фиолетовые клетки достаточно близкие к уже найденным while (L < (openList = closedPoints.reduce(nearestPinc, openList)).length) { L = openList.length; } return closedPoints.reduce(nearestYellow, openList) }

C# и .Net. Почему пользовательская функция Swap работает неправильно?

#c_sharp #массивы #net


Добрый вечер!

Задача следующая: Дан так называемый ступенчатый(зубчатый) массив целых чисел
 int[][] matrix. Для определенности, пусть массив будет размерности 5:

    int[][] matrix = new int[5][]
    {   
        new int[10] {5, 5, 5, 5, 5, 5, 5, 5, 5, 5},
        new int[4] {2, 2, 2, 2},
        new int[5] {20, 20, 20, 20, 20},
        new int[3] {1, 2, 1},
        new int[4] { 2, 3, 4, 5 }
    }


Необходимо поменять две любые строки между собой. Для этого я написал следующую функцию
Swap:

    /// 
    /// Swapping matrix strings
    /// 
    /// first string
    /// second string
    private static void SwapMatrixStrings(int[] a, int[] b)
    {
        int[] tmp = a;
        a = b;
        b = tmp;
    }


Казалось бы, что переменные типа int[] - это переменные ссылочного типа. Но почему
тогда после вызова:

    Swap(matrix[0], matrix[1]);


массив int[4] {2, 2, 2, 2} не поменялся местами с массивом int[10] {5, 5, 5, 5, 5,
5, 5, 5, 5, 5} в массиве matrix?

UPD. Если в методе передавать параметры по ссылке с помощью ключевого слова ref,
то метод работает так, как надо.
    


Ответы

Ответ 1



Потому что она обменивает локальные переменные, а не параметры. Параметры в C# передаются по значению, если не указано ref или out. Это относится и к параметрам ссылочного типа, при этом по значению передаётся ссылка. Попробуйте указать в сигнатуре функции ref. Что происходит в вашем коде? В функцию SwapMatrixStrings вы передали ссылочные выражения matrix[0] и matrix[1] в качестве аргументов. То есть, параметры a и b получили значение, совпадающее с matrix[0] и matrix[1] (то есть, их копии). В результате выполнения вашей функции, значения a и b поменялись местами. Но это никак не затрагивает исходные величины matrix[0] и matrix[1].

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

#javascript


Здравствуйте.

Подскажите, как сделать, чтобы не дублировать этот код:

var showError = function(el) {
  el.parentNode.classList.remove('error');
  el.parentNode.classList.add('success');
  el.nextElementSibling.InnerHTML = element.dataset.error;
}
var showSuccess = function(el) {
  el.parentNode.classList.remove('error');
  el.parentNode.classList.add('success');
  el.nextElementSibling.InnerHTML = '';
}

    


Ответы

Ответ 1



function getClassSwitcher(classOff, classOn, getErrorMsg) { return function(el) { el.parentNode.classList.remove(classOff); el.parentNode.classList.add(classOn); el.nextElementSibling.innerHTML = getErrorMsg(); }; } const showError = getClassSwitcher('success', 'error', () => element.dataset.error); const showSuccess = getClassSwitcher('error', 'success', () => ''); Вариант попроще: function toggleClasses(el, on, off) { el.classList.remove(off); el.classList.add(on); } const showError = function(el) { toggleClasses(el.parentNode, 'error', 'success'); el.nextElementSibling.innerHTML = element.dataset.error; } const showSuccess = function(el) { toggleClasses(el.parentNode, 'success', 'error'); el.nextElementSibling.innerHTML = ''; }

Как проверить что class = “X” и заменить X на Y?

#javascript #jquery


Всем привет, подскажите пожалуйста где ошибка

Суть в том что мне нужно проверить если class=like-r где id="colorlikreviews" , то
заменить class=like-r на class=like-rs, если нет то указать class=like-r 

    if($("#colorlikreviews").className == 'like-r'){
        document.getElementById("colorlikreviews").className = 'like-rs';
    }else{
        document.getElementById("colorlikreviews").className = 'like-r';    
    }

    


Ответы

Ответ 1



if ($("#colorlikreviews").hasClass("like-r")) { $("#colorlikreviews").removeClass("like-r"); $("#colorlikreviews").addClass("like-rs"); } else { $("#colorlikreviews").addClass("like-r"); } А ошибка, скорее всего, в id элемента: "colorlikereviews". Update Ух-ты! Оказывается, toggleClass хитрее, чем я думал. function SwitchClass() { if ($("#colorlikreviews").hasClass("like-r")) { $("#colorlikreviews").toggleClass("like-r like-rs"); } else { $("#colorlikreviews").addClass("like-r"); } } .like-r { width:200px; height:200px; background:red; color:yellow; } .like-rs { width:200px; height:200px; background:green; }
AAA


Ответ 2



Как проверить что class = “X” Проверять атрибут class на равенство - плохая идея. class нужно рассматривать как список классов(с неопределённым порядком). Для работы с этим списком у DOM элементов есть специальный объект Element.classList. Как проверить, что у элемента есть class X? Вот так: if (el.classList(hasClass('X'))) { // ... } и заменить X на Y? Метода для подобной замены в classList нет. Но мы всегда можем удалить один и добавить другой класс: el.classList.remove('X'); el.classList.add('Y'); В примерах выше, el - DOM Element, субъект манипуляций. Применительно к коду в вопросе это: var el = document.getElementById("colorlikreviews");

Переход к якорю при заданном base

#html


Можно ли в отдельно взятой ссылке тега  отключить влияние ?

Например, в html-документе имеется тег , задающий корневой
адрес сайта. Так вот, если на странице some.html я указываю 

Ответ 1



Если не писать путь к some.html, то придется использовать JS.
Anchor Или так: window.onload = function () { document.getElementById("anchor-test").addEventListener("click", function(e) { document.location.hash='test'; e.preventDefault(); }); } https://stackoverflow.com/questions/8108836/make-anchor-links-refer-to-the-current-page-when-using-base

блоки try-catch. Обработка исключений

#java #исключения #try_catch


правильно ли я понимаю, что если первое закрытие выбросит ошибку, то остальные даже
и не вызовутся? подскажите как ПРАВИЛЬНО исправить, а главное почему именно так!

private void closeStatement() throws DaoException, SQLException {
    try {
        getByIdStmt.close();
    } catch (Exception e) {
        throw new DaoException("Error! getByIdStmt is not closed");
    }
    try {
        updateStmt.close();
    } catch (Exception e) {
        throw new DaoException("Error! updateStmt is not closed");
    }
    try {
        addStmt.close();
    } catch (Exception e) {
        throw new DaoException("Error! addStmt is not closed");
    }
    try {
        deleteStmt.close();
    } catch (Exception e) {
        throw new DaoException("Error! deleteStmt is not closed");
    }
    System.out.println("Statement close");
}

    


Ответы

Ответ 1



Возможно, так: private void closeStatement() throws DaoException, SQLException { ArrayList err = new ArrayList(); try { getByIdStmt.close(); } catch (Exception e) { err.add("getByIdStmt"); } try { updateStmt.close(); } catch (Exception e) { err.add("updateStmt"); } try { addStmt.close(); } catch (Exception e) { err.add("addStmt"); } try { deleteStmt.close(); } catch (Exception e) { err.add("deleteStmt"); } if (!err.isEmpty()) { throw new DaoException("Error! "+String.join(", ", err)+" not closed"); } System.out.println("Statement close"); } Поочерёдно пытаемся закрыть все statement, неудачи собираем. Потом выбрасываем общее для всех ошибок исключение.