Здравствуйте. Вопрос, возможно, глупый, но меня, как новичка, это очень интересует.
Предположим, я использую vuejs для интернет магазина. Товар выводится с помощью JS,
фильтрация идет с помощью vue. Я так понимаю, что тогда будет проблема с индексацией
сайта. Так как робот не сможет нормально проиндексировать то, что появляется после
загрузки страницы.
Как в таком случае быть? Может я неправильно понимаю логику применения vue и подобных
framework?
Ответы
Ответ 1
Современные поисковые движки хорошо заточены под индексирование более менее-статического
контента. Поэтому с индексированием Single Page Applications, которые вообще целиком
js-динамика у них трудности. И это проблема. Как для поисковиков так и для разработчиков.
Со стороны разработчиков самым распространенным подходом является так называемый
SSR - server side rendering. Это когда каркас приложения (значительная часть html-разметки)
генерируется на сервере, потом отдается на клиент, соответственно поисковик может ее
нормально проиндексировать. И на клиенте этот каркас обычно "оживляется" всякими дополнительными
обработчиками и прочей динамикой в зависимости от действий юзера.
При этом кусочек серверной части приложения ответственной за рендеринг написан с
использованием обычно примерно того же что и клиентской части. React там или vuejs.
Поддержка SSR есть в большинстве современных js-фреймворков.
Конкретно у vue.js есть мануал на русском языке про SSR. Там много написано про
SSR в общем, не только конкретно про vue.
Если вопросы SEO стоят прям очень жестко, то нужно учесть что поисковики пытаются
решить проблему со своей стороны все лучше обучая своих ботов понимать динамику, и
могут занижать в выдаче сайты с SSR.
Но где-то год назад на родные механизмы полагаться было сложно и SSR был гораздо
лучшим способом чем тонкая настройка под краулеры.
Файл создается но при открытие вылетают ошибки и файл закрывается
пробовал через py2exe но файл даже не создался, может кто что подскажет
from cx_Freeze import setup, Executable
packages = ["vk","requests","json","urllib.request","os","time"]
build_exe_options = {
"packages": packages,
"includes": packages,
'include_files': [],
'zip_include_packages': "*",
'zip_exclude_packages': None,
'include_msvcr': True,
'constants':{}
}
setup(
name = "reer",
version = "0.1",
description = "Blackjack",
options={"build_exe": build_exe_options},
executables = [Executable("reer.py")]
)
Ответы
Ответ 1
Добавь список пакетов в файле setup.py для cx_freeze.
packages = ["os","utils","struct","mschap","pytz","motor","aiohttp","asyncio","sms"]
Этот список положишь в параметры, например дальше у меня так:
build_exe_options = {
"packages": packages,
"excludes": excludes,
"includes": packages,
'include_files': [],
'zip_include_packages': "*",
'zip_exclude_packages': None,
'include_msvcr': True,
'constants':{}
}
и передаём в
cx_setup( name = "project",
version = "0.1",
description = "project build",
options = {"build_exe": build_exe_options},
executables = executables,
data_files = ['config.json']
)
В твоем случае пакет inda плохо собирается - надо добавить его.
Начал изучать Linux. Установил Lubuntu 16.04. У меня есть росшаренная папка на Windows-машине.
Как мне написать скрипт (типа DOS-батника) и разместить его на рабочий стол Lubuntu,
что бы по необходимости, нажать на него и выполнится команда:
mount.cifs //192.168.1.2/general /mnt/general -o username=user,password=12345
и такой же самый "ярлык" с командой:
umount /mnt/general
Та и вообще как создавать ярлыки на рабочий стол, например для офисного документа
(электронная таблица). Что бы "далекий" пользователь могла сразу его запускать?
Заранее спасибо.
Ответы
Ответ 1
для выполнения команды надо создать файл с произвольным именем и суффиксом .desktop
такого минимального содержимого (возможно, некоторые строки даже лишние):
[Desktop Entry]
Name=какое-нибудь имя
Exec=команда (с параметрами)
Terminal=false
Type=Application
чтобы он появился на «рабочем столе» некоего пользователя, надо поместить его в соответствующий
каталог. путь к этому каталогу можно получить, выполнив от имени целевого пользователя
команду:
$ xdg-user-dir DESKTOP
пример вывода:
/home/user/Desktop
вроде бы, нынче некоторые «особо умные» de (desktop environments) начинают «вставлять
палки в колёса», сообщая какой-то бред про «запуск недоверенной программы» (или что-то
в этом духе), если у данного файла не стоит битов исполнимости. потому, на всякий случай,
лучше их поставить:
$ chmod +x файл
Ответ 2
У меня kubuntu, так что для Lubuntu детали могут отличаться.
На рабочем столе нажать правой кнопкой, выбрать Создать -> Текстовый файл.
В этом файле вводим текст
#!/bin/sh
sudo mount.cifs //192.168.1.2/general /mnt/general -o username=user,password=12345
Сохранить, закрыть.
Далее на этом файле нажимаем правой кнопкой мыши, выбираем Свойства. На вкладке Права
выставляем флаг Является выполняемым.
В общем все. У меня заработало (команда конечно же была другая).
Ярлыки для документов на рабочем столе создаются также как и в Windows, при помощи
технологии Drag&Drop (перетаскивание мышью). У меня для создания ярлыка, а не перемещения
файла, потребовалось нажать кнопку Alt.
На форме есть кнопка, при нажатии на которую отображается usercontrol. Если в метод
click кнопки поместить процедуру, то она будет выполняться, затем выход из метода click
и только тогда появляется usercontrol.
А как сделать чтобы сначала показался usercontrol, а затем начал выполняться код
процедуры?
Ответы
Ответ 1
Код нужно поместить в следующую процедуру в самой форме:
Private Sub UserForm_Activate()
MsgBox "Run after activation (show) of form "
End Sub
Если вы не хотите чтобы процедура была внутри класса контроля, то создайте процедуру
общего доступа (Public) в любом модуле и тоже вызывайте ее из процедуры активации UserForm_Acivate.
.. В модуле:
Public Sub DoSomethingAfterControlShow()
MsgBox "Ok After show"
End Sub
.. В UserForm:
Private Sub UserForm_Activate()
DoSomethingAfterControlShow
End Sub
Ответ 2
Если я правильно понимаю суть вопроса, то код
Private Sub btnShow_Click(sender As Object, e As EventArgs) Handles btnShow.Click
MsgBox("Hi")
btnUnvisible.Visible = True
End Sub
выполняется синхронно и контрол btnUnvisible появляется только после нажатия на кнопку
"Ок" диалогового окна. Для того, чтобы любой код (в моем случае это msgbox, но может
быть вызов любой другой процедуры) выполнялся асинхронно, нужно переписать обработчик
события следующим образом:
Private Async Sub btnShow_Click(sender As Object, e As EventArgs) Handles btnShow.Click
Dim t = New Task(Sub()
MsgBox("Hi")
' здесь может быть вызов процедуры или любой другой код
End Sub)
t.Start()
btnUnvisible.Visible = True
Await t
End Sub
В данном случае код внутри Task будет выполнен асинхронно (в другом потоке или в
этом же, в зависимости от более оптимального расклада с точки зрения пула потоков),
весь код между объявлением объекта Task и ожиданием завершения асинхронной процедуры
Await t будет выполнен "параллельно" - таким образом, при нажатии на кнопку будет одновременно
отображен другой контрол и показано диалоговое окно
У меня есть слайдер с текстом. Там 6 элементов li. Мне нужно чтобы при активности
первого элемента менялся фон блока всего, затем при активности второго менялся фон
уже на другой и т.д
Ответы
Ответ 1
Приблизительно такое решение на jQuery. Можете изменять его соответственно вашей вёрстке.
UPD: упростил решение, вместо функции используется массив.
var images = [
'https://yandex.ru/images/today?size=1920x1080',
'http://www.carscope.ru/piclib/1280/960/91699.jpeg',
'https://ru9.anyfad.com/items/t1@a8c329ba-9f5c-40d1-92eb-b43b0d6edb37/Blyuda-iz-tykvy-recepty.jpg'
];
$('document').ready(function() {
$('.content').css('background-image', 'url('+images[$('li.active').index()]+')');
});
$('.content li').click(function() {
$('.content li').each(function() {$(this).removeClass('active');})
$(this).addClass('active');
$('.content').css('background-image', 'url('+images[$(this).index()]+')');
});
.active a {
color: red;
}
.content {
width: 500px;
height: 500px;
}
Имеется абстрактный (базовый) класс (для примера):
public abstract class ClassBase
{
protected static Logger logger = new Logger("logger_name");
}
И два потомка:
public class Class1 : ClassBase {}
public class Class2 : ClassBase {}
У потомков должен быть общий логгер. Logger реализует IDisposable. Как быть в таком
случае? Мы же ведь не может выполнить Dispose на данном члене
Ответы
Ответ 1
Никак. Статические поля не нужно Dispose()-ить, ведь они будут использованы другими
экземплярами класса, создаваемыми после окончания работы Dispose() данного экземпляра.
Возможно, вам понадобится «вручную» закрыть логгер в конце работы программы, в тот
момент, когда вы можете гарантировать, что экземпляров данного класса (и его потомков)
больше нет. Более правильное решение — изменить дизайн логгера, чтобы он не требовал
вызова Dispose() в конце работы.
Всем доброго времени суток)
Разрабатываю систему с использованием DDD.
В системе есть 2 модуля:
Модуль конфигурации. Он занимается регистрацией новых устройств: само устройство,
его модель и прочие параметры.
Модуль проверки устройства на дефекты.
Каждый тип устройства описывает конкретный класс-сущность (entity). При этом при
создании объекта класса-сущности необходимо производить валидацию его параметров. Регистрация
нового устройства в системе заканчивается его сохранением в базе данных с использованием
соответствующего репозитория (repository).
В модуле проверки выбранное из списка устройство загружается в программу из базы
данных. При помощи соответствующего репозитория на основе идентификатора возвращается
устройство для проверки на неисправности. На выходе репозитория в диагностику загружается
соответствующий объект класса-сущности устройства. Однако для создания такого объекта
необходимо проводить его валидацию.
Возникает вопрос: насколько необходимо проводить валидацию извлеченной из базы данных
информации, если изначально в базу данных записывается верная информации о сущности?
Сама валидация осуществляется классом-валидатором, встраивающимся в соответствующий
объект-сущность устройства.
Может быть я что-либо совсем не так понимаю?
Ответы
Ответ 1
В базе нужно хранить уже достоверную и правильную информацию, чтобы сохранялась целостность
данных. То есть что ты именно будешь верифицировать при извлечении из бд, я не понимаю.
Проверять данные на корректность, нужно обязательно (!!) перед сохранением в БД.
Ответ 2
Я полностью согласен с @ImZ в том что при восстановлении из БД сущности валидировать
не надо. Однако, проверять надо не перед сохранением в БД, а при попытке изменить сущность.
Т.е. более правильно, когда нельзя привести сущность в невалидное состояние передав
неправильное значение. Для этого сущность должна проводить проверку на корректность
значений задаваемых через публичный интерфейс.
Все это приводит к двум выводам:
Сущность сохраняемая в БД априори валидна и повторная валидация не
требуется.
Если используется не тупой объект с сеттерами и
геттерами, то вполне ожидаемо, что часть полей представляющих
состояние объекта не будет представлено в публичном интерфейсе. И
чтобы не идти на нарушение инкапсуляции добавляя геттеры и сеттеры,
необходимы механизмы инициализации объекта минуя публичный
интерфейс.
Т.о. задача сохранения и восстановления в/из БД это чтение и последующая запись некоторого
приватного состояния в объект.
Почему new Date возвращает одни и те же значения(одно и тоже время)?
Нужно чтоб при добавление сообщения ему возвращалась соответствующие время(при котором
он был добавлен).
В коде ниже выводятся сообщения с одним и тем же значением времени, пока страницу
не перезагрузишь.
В чем дело? я что то не так сделал или так и должно быть?
var time = new Date();
var timeS = time.toISOString();
$("#add-text").click( function() {
var message = $("#text").val();
$("#chat").append("
Объявляйте время при клике
$('#add-text').click(function(){
var time = new Date();
var timeS = time.toISOString();
/*Далее ваш код*/
})
Ответ 2
у тебя уже получается сначала дата создается и присваивается в момент инициализации
переменной
var time = new Date();
var timeS = time.toISOString();
и его ты уже используешь
Если я правильно понял то тебе надо инициализировать переменную в момент вызова этой
переменой. Как показал @DarkSir при клике
Столкнулся с проблемой, что в проекте WPF неудобно работать на пол окна с редактором
XAML и пол окна с конструктором. Сделал отображение на весь экран, но теперь, чтобы
перейти с конструктора на редактор и обратно, нужно постоянно кликать мышью.
С редактора на конструктор можно перейти Shift + F7.
Кто-нибудь знает горячую клавишу для обратного действия? Ctrl + Alt + 0 переводят
на код, а нужно именно на XAML.
Ответы
Ответ 1
Shift + F7 Делает то что нужно, т.е. работает как Toggle. Туда и обратно переключает.
Привет. Собственно, вопрос, стоит ли использовать memcached и Opcache вместе на PHP7?
Почувствую ли я какой-то прирост производительности? Как гласит ответчик в теме на
англоязычном StackOverflow:
OPcache is for accelerating code access
Что это значит? Ускорение доступа к коду? Или ускорение доступа кода к чему-то?
memcached is for accelerating data access
memcached нужен для ускорения доступа к данным. К каким?
Ответы
Ответ 1
Как обычно выполняется PHP скрипт?
PHP открывает файл с кодом, компилирует его, затем выполняет. Поскольку файлов может
быть много, процесс их открытия, чтения и компиляции может отнимать кучу времени и
ресурсов. Если файлы не меняются, то постоянную компиляцию можно не делать. Лучше сделать
ее один раз и закэшировать результат.
Именно это и делает модуль opCache. Результат первой компиляции будет сохранен в
кэш, с которым и будет работать PHP. Таким образом это ускорит выполнение за счет отсутствия
тяжелого процесса компиляции. Когда файлы изменяются, модуль сам сбросит кэш и обеспечит
перекомпиляцию. Короче, этот модуль делает очень полезную экономию ресурсов даже без
необходимости его как-то настраивать. Чем сложнее приложение, тем выше эффективность
этой оптимизации.
Часто код просто медленный
Например, обращения к внешним API, тяжелые выборки из баз данных, обработка больших
файлов может занимать продолжительное время. В этом случае, кэширование данных следует
использовать, как средство оптимизации и в этом вам поможет memcached, который поможет
сохранить часто получаемые результаты. Например сложная выборка из БД, которая пригодится
многим пользователям, но очень сильно напрягает базу данных, хотя почти для всех одинакова
с минимальными отличиями. Memcached спроектирован так, чтобы все его операции имели
алгоритмическую сложность O(1), т.е. время выполнения любой операции не зависит от
количества ключей, которые хранит memcached. Естественно, нужно учитывать, что архитектура
предполагает потерю данных в случае сбоя.
Результат
OpCache -> сохраняет опкоды для увеличения производительности исполнения кода ->
данные регулируется непосредственно PHP и конфигурацией
Memcached -> необходим для сохранения часто используемых данных и следовательно увеличивает
скорость получения данных -> записываемые данные и их ключи регулируются разработчиком,
который использует данное программное обеспечение
Полезные ссылки
Обзор OpCache и алгоритма работы
Обзор Memcached и алгоритма работы
Как лучше разместить своё портфолио на GitHub? Вот например я недавно сверстал сайт,
прикрутил мини сервер который наполняет его товаром, но на GitHub ведь сервер не запустишь,
а если запускать просто HTML страницу, то не будет товара и некоторых функций.
Или стоит просто в описание добавить чтобы качали Git и запускали у себя? А прямо
на GitHub просто сверстанную страницу показать?
Ответы
Ответ 1
GitHub — это портфолио вашего кода. Туда потенциальный работодатель может посмотреть,
чтобы понять, какой код вы пишете, в каких проектах участвуете.
Для портфолио с динамическими сайтами нужен традиционный хостинг. Для нетребовательных
демонстрационных сайтов без каких-либо посетителей хватит самых дешёвых хостингов (возможно,
даже бесплатных). GitHub хостит только статические странички.
Отмечу, что по возможности стоит демонстрировать реальные работающие проекты, в которых
вы приняли участие, а не поделки на коленке. Если вы кодируете back-end, то гораздо
интереснее будет код. Если вы кодируете front-end или дизайните страницы, то работающий
сайт уже будет важен.
Ответ 2
Не думаю, что показывать работодателю "интернет-магазин" это хорошая идея. Существует
множество таких же, но уже готовых решений, к примеру, тот же VirtueMart. Кроме того,
никто не любит вчитываться, язык бизнеса это наглядность. Маловероятно, что кто-то
дойдет дальше регистрации на подобном ресурсе.
В этом репозитории автор поднимает вопрос неверного оформления большинства портфолио
программистов на Github Pages. Повсеместное использование Bootstrap с наполнением текстом-рыбой
делает написание очередной поделки контрпродуктивным. Как решение проблемы предлагается
создать PWA с максимальной компактностью, приметностью и актуальными использованными
инструментами.
Есть две иконки: 1-ая (иконка сверху) стоит обычная, но при ховере она должна закрашиваться
(иконка снизу). Как такое реализовать, да еще и плавно, желательно?
P.S. Вариант только создать две png иконки и подменять при ховер ?
Ответы
Ответ 1
Чтобы при ховере изменять цвет заливки, используйте свойство fill-opacity и, при
необходимости, stroke-opacity:
svg {
display: block;
width: 200px;
height: 162px;
margin: 40px auto;
}
path {
fill-opacity: 0;
fill: #f00;
stroke: #f00;
transition: all 0.4s linear;
}
svg:hover path {
fill-opacity: 1;
stroke-opacity: 0;
}
Ответ 2
Самый простой способ с двумя картинками друг над другом и изменением прозрачности
верхней:
div {
width: 50px;
height: 50px;
background: url('https://i.stack.imgur.com/G1BtB.jpg') no-repeat -20px -14px;
overflow: hidden;
}
.item:hover {
opacity: 0;
transition: all 500ms ease;
}
.item-wrapper {
background-position: -20px -88px;
}
Имеется следующий код:
IQueryable users = from c in db.UserSet
where c.Date == dateTimePicker1.Value &&
c.FirstName == textBox2.Text &&
c.LastName == textBox3.Text &&
c.Patronym == textBox4.Text &&
c.City == textBox5.Text &&
c.Country == textBox6.Text
select c;
Помогите реализовать проверку на null в каждом поле. То есть если сейчас хотя бы
одно поле будет пустым, то запрос выдаст 0 строк независимо от других условий. Как
можно сделать так, чтобы пустые поля игнорировались, и запрос выполнялся по остальным
условиям?
Конечно можно сделать проверку на уровне if (textbox1.text!=null){...} но я так понимаю
это много лишнего кода.
Можно еще так:
Если исходить из того, что условная конструкция будет представлена в виде простой
бинарной операции, для которой необходимо проверить, что значением правого операнда
не является значение по умолчанию. Тогда можно воспользоваться деревьями выражений,
а саму проверку вынести в отдельный метод расширения.
public static class EfExtension
{
public static IQueryable WhereIfRightIsNotDefault(this IQueryable source,
Expression> predicate) where T : class
{
var body = predicate.Body as BinaryExpression;
if (body == null)
return source;
// Получаем значение правого операнда.
var currentValue = Expression.Lambda(body.Right)
.Compile().DynamicInvoke();
// Получаем значение по умолчанию для типа правого операнда.
var defaultValueForType = GetDefaultValueForType(body.Right.Type);
// Сравниваем текущее значение со значением по умолчанию.
var isEquals = EqualityComparer