Скачал с GitHub репозиторий для работы с языком (лингвистика), но к сожалению он написан на python 2, а у меня python 3 компилятор. Я знаю, что есть встроенная библиотека 2to3, которая меняет исходный код файла с python 2 на python 3 этой командой C:\myDir>2to3 -w -n myFile.py
Файлов очень много, по этому мне хотелось бы узнать, возможно ли найти все файлы с расширением .py в этой папке или во всех дочерних и применить к ним эту команду
Ответ
Пример из доки:
To translate an entire project from one directory tree to another use:
$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode
Добрый вечер! Можно ли в ОС Windows задать завершение процесса с определенным названием по нажатию клавиши (сочетания клавиш)? Причем данное действие должно выполняться независимо от того, какое окно активное. Например: я нахожусь в Microsoft Office Word, нажимаю ctrl+k - и у меня завершается процесс с названием notepad.exe, если он запущен. Или хотя бы по нажатию клавиш запустить bat-файл?
Ответ
Можно. Даже легко. Создайте bat-файл с нужным вам содержимым и сделайте ярлык к нему. В свойствах ярлыка можно будет назначить горячую клавишу.
На небольшом инстансе на digitalocean (1 CPU, 1 Gb RAM, Ubuntu 14) установлен WordPress без каких-либо плагинов. Я заметил что MySQL на нем падает после 10 одновременных соединений. Немного изменив настройки MySQL удалось добиться работы не более примерно 20 одновременных запросов. Вопросы - это нормально? Какую вообще нагрузку должен выдерживать WordPress и MySQL? Как вообще живут высоконагруженные WordPress сайты? Что надо изменить чтобы повысить нагрузку (кроме очевидного повышения мощности инстанса)? Как можно автоматически поднимать MySQL после падения? Кэширование страниц - не вариант, предполагается что будут работать залогиненные пользователи с разным контентом. Тестирование я делал с помощью Apache Jmeter.
Ответ
При правильной настройке сервера - до 10,000 соединений в секунду. Почитайте мою статью https://kagg.eu/10000-clients-second-wordpress/ с результатами нагрузочных тестов.
Я новичок в PHP, не могу понять как использовать одинарные кавычки дважды (в echo и коде). Вот пример: echo '
';
echo '
';
Мне нужно чтобы в background-image: url(" - вместо двойной кавычки использовалась одинарная. Но если её проставить то код уедет. Надеюсь, вы меня поймете ибо не знаю, как ещё изложить свои мысли на этот счет..
Ответ
вариант 1: экранирование echo '
';
Вариант 2: поменять местами с двойными echo "";
Суть игры: произвольная фигура (circle, square, triangle, rhombus) движется слево направо в игровом поле 80% от ширины браузера. Когда игрок нажимает на фигуру она исчезает, очки добавляются к счету (от 0 до 100 очков, в зависимости от того, насколько далеко фигура успела сместится от левого края). Следующая произвольная фигура начинает движение. Пока получилось так (неправильно и совсем по-дилетантски):
$("#circle").animate({ left: '100%' }, 7000 );
$("#rhombus").hide();
$("#circle").click(function(){
$(this).hide();
$("#rhombus").show().animate({ left: '100%' }, 7000 );
$('#count').html(+$('#count').html()+1);
});
body {
text-align: center;
background: #F0EFEE;
color: #777;
}
#count {
position: fixed;
display: inline-block;
float: left;
padding: 10px 20px;
background: #fff;
font: 1.5rem/1 monospace;
border-radius: .25rem;
box-shadow: 0 2px 2px rgba(0, 0, 0, .2);
z-index:20;
left:20px;
top:15px;
}
.linear {
display: inline-block;
position: relative;
margin: 20px 16px 20px 20px;
width: 80%;
height: 400px;
background:white;
}
#left {
background: #F0EFEE;
width: 10%;
height: 100%;
top:0;
left:0;
position: fixed;
z-index:15;
}
#right {
background: #F0EFEE;
width: 11%;
height: 100%;
top:0;
left:89%;
position: fixed;
z-index:15;
}
#circle {
position: absolute;
width: 45px;
height: 45px;
left: 0;
top: 150px;
border-radius: 50%;
background: #F6AC31;
}
#rhombus {
border-style: solid;
border-color: transparent transparent #00BFFF transparent;
border-width: 0 15px 15px 15px;
height: 0;
width: 30px;
left: 0;
top: 150px;
position: absolute;
}
#rhombus:after {
content: "";
position: absolute;
top: 15px;
left: -15px;
width: 0;
height: 0;
border-style: solid;
border-color: #00BFFF transparent transparent transparent;
border-width: 40px 30px 0 30px;
}
0
https://jsfiddle.net/gc0jv3s8/1/
Ответ
Обычно стоит разбивать логику на вспомогательные и оборачивать это в функции (методы) для выделения общей логики по работе с элементами с одинаковым поведением.. Например вот несколько оберток в виде функций:
getRandomInt - дает рандомный выбор элементов из массива. На данный момент он состоит из двух: ['circle', 'rhombus'];. Но можешь добавлять неограниченное их количество (в соответствии с их существованием, конечно).
init - для любой начальной инициализации. На данный момент там прячутся все фигуры, чтобы не было видно. Хотя это можно сделать в CSS, но данная функция призвана показать, что возможны и должны быть сделаны какие-либо действия до основной игры.
spawn - собственно делает порождение элементов:
берет рандомный индекс из массива элементов
определяет его идентификатор. Так как мы знаем его индекс в массиве, то его идентификатор будет равен # плюс имя, которое мы достали из массива по индексу.
запускает саму анимацию
навешивает слушателя клика на элемент с данным идентификатором. on - прикрепляет событие к элементу. Причем прикрепляет это к динамически созданному элементу. Хотя в данном случае это не обязательно....Хотя....Обязательно!))
При клике на выбранный элемент
открепляем событие клика (off). Зачем нам плодить событие?
останавливаем анимацию (stop)
возвращаем элемент в начальную позицию
прячем
заново запускаем генерацию spawn
На самом деле дорабатывать и улучшать тут можно еще много. Но как черновик для начала - достаточно. Вообще хочу напомнить, что для анимации (особенно для игры) скорее лучше использовать setInterval, а то и вовсе requestAnimationFrame. И скорее не элементы DOM дерева, а canvas и WebGL.
В файле ресурсов есть строковый ресурс somestring со значением вида "первая строка вторая строка".
Есть TextBlock, в который должны выводиться эти строки, соответственно с переносом строки. Но они выводятся почему-то в таком виде, как написаны, т.е. " " просто пропечатывается и строки не переносятся.
Я пробовал ресурс и привязывать в xaml через x:Uid, и в коде через ResourceLoader, результат один и тот же и не тот, что нужен.
Как можно решить это проблему?
Ответ
Вместо нужно использовать Shift + Enter. Текст в ресурсах не форматируется escape-последовательностями.
Сдавал финальный экзамен на intuit.ru. Курс по java, на следующий вопрос про synchronized-блок получил, что ответ неверный. Никак не могу понять почему. Может кто подскажет, спасибо.
В самом курсе черным по белому написано, что и к полям, и к методам объекта, на который вешается lock, можно без проблем обращаться другим потокам. (Ну, видимо, кроме synchronized методов, ибо они пытаются повесить lock на объект, из которого вызываются, а он уже залочен по условиям задачи. Но сути это не меняет, к полям тоже можно обращаться, т.е. вариант 4 не подходит...) Может что с 2003 года поменялось... (курс старый)
Ответ
Тут три варианта: либо вопрос поставлен некорректно, либо ответы сформулированы не совсем ясно (особенно третий, который можно трактовать в сторону правильного), либо в тесте ошибка и правильного варианта ответа нет. Если один поток начал исполнение synchronized-блока, указав ссылку на некий объект, то другой поток сможет обратиться к полю этого объекта и так же сможет обратиться к методу этого объекта (если метод не синхронизированный). Синхронизация по объекту накладывает ограничение на другие блоки синхронизации по этому же объекту и на вызов синхронизированных методов. На доступ к полям и не синхронизированным методам synchronized-блок не влияет. И пример: public class Foo {
public int mValue = 5; public String bar() {
return "bar";
}
}
public class Main {
private static Foo sFoo; public static void main(String[] args) {
sFoo = new Foo(); new Thread(() -> f()).start(); new Thread(() -> {
System.out.println("Second thread: start");
System.out.println("Member: " + sFoo.mValue);
System.out.println("Method: " + sFoo.bar());
System.out.println("Second thread: end");
}).start();
} private static void f() {
synchronized (sFoo) {
try {
System.out.println("First thread: start");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("First thread: end");
}
}
}
Вывод на консоль: First thread: start
Second thread: start
Member: 5
Method: bar
Second thread: end
First thread: end
Необходимо, чтобы программа, выполняясь в фоне, при зажатии ЛКМ перемещала курсор. Подскажите, как и с помощью чего это сделать на MS Windows?
Ответ
Вам потребуется WinAPI, язык сам по себе таких средств не представляет. Для того, чтобы прочитать/записать позицию курсора, используйте GetCursorPos/SetCursorPos Для того, чтобы узнать, когда нажата левая кнопка мыши, в вашем приложении, нужно обработать оконные сообщения WM_LBUTTONDOWN и WM_LBUTTONUP (документация) в вашей оконной процедуре. Если вы хотите обрабатывать и чужие приложения, вам нужно установить хук, подробнее об этом смотрите этот ответ
пытаюсь зайти, но ничего не происходит - просто мигает курсор
Ответ
Ваша задача запустить на выполнение экземпляр php.exe в произвольном месте системы. Когда вы находитесь в каталоге, и набираете команду php.exe система пытается запустить этот файл. Сначала она ищет его в текущей папке, затем в системной, а затем во всех папках указанных в переменной окружения PATH Вы написали, что прописали Path, но на самом деле сделали вы не это.
Переменная окружения PATH, содержит пути, где система производит поиск файлов. Это могут быть и файлы которые вы явно запускаете, и dll, которые пытаются найти другие программы и т.п. Если вы отредактируете переменную PATH и добавите туда путь к папке с php.exe, то при выполнении команды php система найдет ее в данной директории и выполнит.
Переменная PATH есть как глобальная, так и для текущего пользователя. Что можно видеть в диалоговом окне настройки. Поэтому в данном случае, вам необходимо отредактировать переменную PATH и добавить туда путь директории, содержащей интерпретатор (E:\Program Files\OpenServer\modules\php\php-7.1-x64). Директории разделяются После того как сохраните изменения и перезапустите cmd.exe вы сможете выполнять команду php index.php в любом месте файлов системы. А из ваших скриншотов видно, что вы не Path отредактировали, а добавили новую переменную окружения PHP. При использовании переменные заключают в символы %, после чего система транслирует имя переменной в ее значение. Поэтому создав переменную PHP, указывающую на php.exe вы можете просто выполнять команду %PHP%, и, например, %PHP% index.php. Переменные используеются в различных местах, например, есть переменная TMP содержащая путь к папке со временными файлами. Команда cd %TMP% осуществит переход в данную директорию и т.д.
Есть ListBoxсо списком автомобилей Есть коллекция, в которой находятся данные из БД ObservableCollection Auto; как сделать удаление нескольких выделенных в ListBox автомобилей?
для удаления 1 авто использую следующий код public RelayCommand DeleteCommand
{
get
{ return deleteCommand ??
(deleteCommand = new RelayCommand((selectedItem) =>
{
MessageBoxResult result = MessageBox.Show("Вы действительно желаете удалить элемент?", "Удаление", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (selectedAuto == null || result == MessageBoxResult.No) return;
// получаем выделенный объект
Auto auto = selectedAuto as Auto;
db.Autos.Remove(auto);
db.SaveChanges();
OnPropertyChanged("HasAuto");
}, CanEditOrDeleteAuto));
}
}
Класс Auto выглядит следующим образом(таблица БД выглядит также) class Auto : INotifyPropertyChanged
{
private string model;
private string marka;
private int cost;
private int maxSpeed; public int Id { get; set; } public string Model
{
get
{
return model;
} set
{
model = value;
OnPropertyChanged("Model");
}
} public string Marka
{
get
{
return marka;
} set
{
marka = value;
OnPropertyChanged("Marka");
}
} public int Cost
{
get
{
return cost;
} set
{
cost = value;
OnPropertyChanged("Cost");
}
} public int MaxSpeed
{
get
{
return maxSpeed;
} set
{
maxSpeed = value;
OnPropertyChanged("MaxSpeed");
}
} public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName]string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
БД получаю таким образом public class ApplicationContext : DbContext
{
public ApplicationContext() : base("DefaultConnection")
{
}
public DbSet Autos { get; set; }
}
ViewModel ObservableCollection autos;
private Auto selectedAuto;
public ObservableCollection Autos
{
get { return autos; }
set
{
autos = value;
OnPropertyChanged("Autos");
}
} public Auto SelectedAuto
{
get
{
return selectedAuto;
} set
{
selectedAuto = value;
OnPropertyChanged("SelectedAuto");
}
}
public ApplicationViewModel()
{
db = new ApplicationContext();
db.Autos.Load();
Autos = db.Autos.Local;
}
UDP2
разметка
код VM public ICommand DeleteCommand => new RelayCommand(o => Delete((Collection
Ответ
У меня работает такой способ, разметка:
В коде VM: public ICommand DeleteCommand => new RelayCommand(o => Delete((Collection)o)); private void Delete(Collection o)
{
List list = o.Cast().ToList();
list.ForEach(auto => Autos.Remove(auto));
}
$(".slot").click(function() {
open_slot();
});
function api_call(url, data, callback) {
$.ajax({
url: url,
data: JSON.stringify(data),
cache: false,
contentType: 'application/json',
type: 'POST',
success: function(data) {
if (data.success || data.success == "true") {
callback(null, data);
} else {
callback(data.error, null);
}
}
});
}
function open_slot() {
api_call('api url', {}, function(err, result) {
if (err) {
console.log(error);
} else {
if (result.result == 1) {
$(".result").html("вы выбрали верно!");
// добавляем блоку на который тыкнули класс "select", и всем остальным класс "block"
} else {
$(".result").html("вы выбрали не верно!");
// Тут рандомно надо добавить в один из блоков (исключая блок на который мы нажали) class "select", а всем остальным класс "block". Чтобы якобы показать где на самом деле был правильный вариант.
}
}
});
}
.slot {
display: inline-block;
margin-left: 10px;
width: 100px;
height: 100px;
background: #000;
}
.slot.select {
background: green;
}
.slot.block {
background: red;
}
В коде все описал
Ответ
Лучшее решение я считаю - использовать коллбек, в котором будет меняться отображение объектов. К слову, добавил условие $(".slot").hasClass("select") || $(".slot").hasClass("block"), которое проверяет, выбирали ли мы уже объект и если да, то предотвращает выбор еще одного. Вот так:
$(".slot").click(function() {
if ($(".slot").hasClass("select") ||
$(".slot").hasClass("block")) {
return;
}
let thisEl = $(this);
open_slot(function(result) {
if (result) {
$(".result").html("вы выбрали верно!");
thisEl.addClass("select");
} else {
$(".result").html("вы выбрали не верно!");
$(".slot").addClass("block");
let slots = $(".slot").not(thisEl);
let random = Math.floor(Math.random() * slots.length);
$(slots[random]).addClass("select").removeClass("block");
}
});
});
function open_slot(callback) {
callback(false); // это надо удалить
return; // (костыль для проверки)
api_call('api url', {}, function(err, result) {
if (err) {
console.log(error);
} else {
callback(result.result);
}
});
}
function api_call(url, data, callback) {
$.ajax({
url: url,
data: JSON.stringify(data),
cache: false,
contentType: 'application/json',
type: 'POST',
success: function(data) {
if (data.success || data.success == "true") {
callback(null, data);
} else {
callback(data.error, null);
}
}
});
}
.slot {
display: inline-block;
margin-left: 10px;
width: 100px;
height: 100px;
background: #000;
}
.slot.select {
background: green;
}
.slot.block {
background: red;
}
Есть метод, в котором обрабатываю нажатие по элементу: override fun onListItemClick(itemIndex: Int, itemCode: String) {
presenter.onItemClick(adapter.getItem(itemIndex))
}
Но проблема в том, что пользователь как то умудрился нажать на -1 элемент. Что выдало мне ошибку:
"backtrace" => "[\"java.lang.ArrayIndexOutOfBoundsException: length\u003d25; index\u003d-1\",\" at java.util.ArrayList.get(ArrayList.java:310)\",\" at com.project.android.features.common.base_list.AbstractListAdapter.getItem(AbstractListAdapter.kt:20)\",\" at com.project.android.features.categories.selector.CategorySelectDialog.onListItemClick(CategorySelectDialog.kt:59)\",\" at com.project.android.features.categories.selector.CategorySelectItemViewHolder$1.onClick(CategorySelectItemViewHolder.kt:32)\",\" at android.view.View.performClick(View.java:4856)\",\" at android.view.View$PerformClick.run(View.java:19956)\",\" at android.os.Handler.handleCallback(Handler.java:739)\",\" at android.os.Handler.dispatchMessage(Handler.java:95)\",\" at android.os.Looper.loop(Looper.java:211)\",\" at android.app.ActivityThread.main(ActivityThread.java:5371)\",\" at java.lang.reflect.Method.invoke(Native Method)\",\" at java.lang.reflect.Method.invoke(Method.java:372)\",\" at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:945)\",\" at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:740)\"]",
Как такое возможно? И как исключить момент нажатия пользователя на -1 элементе списка? В одном из мест где использую данный метод: titleView.setOnClickListener { listener?.onListItemClick(adapterPosition, "") }
Перешёл к реализации adapterPosition и увидел следующее:
/**
* Returns the Adapter position of the item represented by this ViewHolder.
*
* Note that this might be different than the {@link #getLayoutPosition()} if there are
* pending adapter updates but a new layout pass has not happened yet.
*
* RecyclerView does not handle any adapter updates until the next layout traversal. This
* may create temporary inconsistencies between what user sees on the screen and what
* adapter contents have. This inconsistency is not important since it will be less than
* 16ms but it might be a problem if you want to use ViewHolder position to access the
* adapter. Sometimes, you may need to get the exact adapter position to do
* some actions in response to user events. In that case, you should use this method which
* will calculate the Adapter position of the ViewHolder.
*
* Note that if you've called {@link RecyclerView.Adapter#notifyDataSetChanged()}, until the
* next layout pass, the return value of this method will be {@link #NO_POSITION}.
*
* @return The adapter position of the item if it still exists in the adapter.
* {@link RecyclerView#NO_POSITION} if item has been removed from the adapter,
* {@link RecyclerView.Adapter#notifyDataSetChanged()} has been called after the last
* layout pass or the ViewHolder has already been recycled.
*/
Возможно где то тут кроется проблема? Так как именно в этом методе возвращается -1. public final int getAdapterPosition() {
if (mOwnerRecyclerView == null) {
return NO_POSITION;
}
return mOwnerRecyclerView.getAdapterPositionFor(this);
}
Ответ
При получении позиции в списке адаптера через метод getAdapterPosition(), возможны ситуации, когда адаптер RecyclerView возвращает значение NO_POSITION (значение константы -1), например, когда клик по айтему произошел во время обновления списка. Такую ситуацию нужно обрабатывать отдельно, например так (совершать действия по клику на айтеме только когда позиция не равна NO_POSITION): @Override
public void onClick(View v) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
switch (v.getId()) {
case R.id.menu_button:
//
break;
case R.id.card:
//
break;
}
}
}
или использовать метод getLayoutPosition(), который тоже имеет свои недостатки (позиция не всегда соответствует действительной при определенных обстоятельствах). Подробнее смотрите офф.документацию (раздел Positions in RecyclerView)
Я хочу вызвать дефолтный метод из интерфейса, но компилятор это не пропускает. public class HelloWorld{ public static void main(String []args){
B b = new B();
b.a();
}
} interface A{
default void a() {
System.out.println("Hi from A.a");
}
} class B implements A {
@Override
public void a() {
super.a(); // Error
System.out.println("Hi from B.a");
}
}
Если это нельзя сделать, обьясните пожалуйста почему.
Ответ
default методы добавлены для обеспечения обратной совместимости с ранними версиями Java Используя их вы можете расширить уже существующий интерфейс не ломая код, который написан для предыдущей версии интерфейса. Все, что будет нужно - это перекомпилировать его. А так как в предыдущей версии этого метода не было, то вы не можете его вызвать используя super Вам нужно использовать абстрактный класс вместо интерфейса или не переопределять метод интереса. Абстрактный класс public class HelloWorld{
public static void main(String []args){
B b = new B();
b.a();
}
} abstract class A {
void a() {
System.out.println("Hi from A.a");
}
} class B extends A {
@Override
public void a() {
super.a();
System.out.println("Hi from B.a");
}
}
Интерфейс public class HelloWorld{
public static void main(String []args){
B b = new B();
b.a();
}
} interface A{
default void a() {
System.out.println("Hi from A.a");
}
} class B implements A {
}
Как убрать стрелки ресайза с правой и нижней стороны блока. Чтобы стрелка для ресайза появлялась и работала только по ярлычку в правом нижнем углу блока. Или просто только по правому нижнему углу.
Ответ
Вам нужно свойство handles Свойство определяет объекты, которые будут использованы для изменения размера области. По умолчанию оно имеет значение 'e, s, se', что означает:
e — правый (восток)
s — нижний (юг)
se — нижний правый (юго-восток)
Вам нужен только se — нижний правый
$('#resizable').resizable({
handles: 'se'
});
$('#resizable').resizable({
handles: 'se'
});
На сервере настроена связка Nginx + Erlang. А именно - nginx слушает 80-й порт и проксирует запросы на порт 8738. Erlang с помощью Cowboy, принимает запросы с порта 8738 и отдаёт статику по http или обрабатывает сообщения по WebSocket. Вот кусок конфига, который за это отвечает: # При запросе страниц бэковой части перебрасываем на эрланг
location /back {
# настройки проксирования на эрланг
proxy_pass http://localhost:8738/back;
proxy_set_header Host $host; # без особой надобности
proxy_cache_valid 502 10s; # недолго кешируем ошибку "502 Bad Gateway", если эрланг ещё не запустился
# всё что ниже нужно для работы вебсокетов
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # передаём заголовок "Upgrade: websocket", если он пришел от клиента
proxy_set_header Connection $connection_upgrade; # добавляем заголовок "Connection: Upgrade", если был передан заголовок "Upgrade: websocket"
}
Это была предыстория. Вообще сейчас не важно что такое Erlang, Cowboy и WebSocket.
Проблема вот в чём После перезагрузки сервера получается так, что nginx стартует раньше чем erlang. Соответственно, nginx не видит ничего на порту 8738 и возвращает 502 Bad Gateway. Да вроде бы и норм, но когда erlang запускается, ситуация остаётся неизменной. Ошибка 502 так и будет возвращаться всегда.
В логах nginx вот это: 2017/06/02 12:07:33 [error] 708#708: *899 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: foobar.com.ua, request: "GET /back HTTP/1.1", upstream: "http://[::1]:8738/back", host: "foobar.com.ua"
Hotfix: просто сделать sudo nginx -s reload и сразу всё работает! Работает сколько угодно времени до первой перезагрузки. Как побороть это?
Ответ
Проблема скорее всего в том, что nginx при загрузке резолвит localhost в IPv6 адрес, а ваш сервер слушает на IPv4 адресе. После перезагрузки конфига nginx повторно резолвит адрес и на этот раз резолвит IPv4 адрес. Если Cowboy слушает на всех портах, то можно в настройках systemd указать nginx что бы он стартовал только после запуска Cowboy.
Готовлюсь к экзамену, там вопрос о диаграмме потоков данных действий. Читаю книгу Салли Шлеер, Стефан Меллор - Объектно-ориентированный анализ: моделирование мира в состояниях, чтобы разобраться в этом вопросе. Но там все так написано, что, вообще, не понятно. Может кто-нибудь, пожалуйста, нормальным языком объяснить, что такое процесс и диаграмма потоков данных действий? Из книги: Процесс - фундаментальный модуль операции.
Диаграмма потоков данных действий обеспечивает графическое представление модулей процесса в пределах действий и взаимодействия между ними. P.S. Это не относится непосредственно к написанию кода, но я не знаю, где еще спросить.
Ответ
Читать желательно внимательнее. Там все есть.
... в ООА задача разбивается сначала на объекты, затем на действия, и наконец, на процессы внутри действия, выдавая в нижней части этой иерархии одну однообразную диаграмму потоков данных для каждого действия. Это отличается от традиционных методик , которые предписывают последовательную декомпозицию функции (единственной) и производят многоуровневый набор диаграмм потоков данных
и
Управление представляется на диаграммах потоков данных действий: явно через потоки управления, и неявно через определенные потоки данных
и читаем про DFD, IDEF0 (пригодиться и IDEF1)
Здравствуйте. У меня есть пульт который подключается к специальному контроллеру через ethernet кабель. Пульт состоит из двух кнопок, а в кабеле имеется только 3 провода. Я хочу подключить компьютеру к контроллеру, что бы компьютер выполнял функции пульта. План был такой:
Сперва я хотел подключить пульт к компьютеру и узнать какого рода команды он подаёт контроллеру нажимая на кнопки. Далее написать не большой код на основе полученной информации, который давал бы команды на контроллер. Потом уже добавил бы те функции программе которые не мог выполнять пульт. Проблема в том, что у меня и так не большой опыт в программировании на c++, а о работе с портами я вообще не чего не знаю. Вопрос: Что потребуется для написания программы которая будет отображать сигнал поступающий на ethernet порт компьютера? Как отправлять сигнал на ethernet порт с помощью c++? Возможно ли вообще всё это? Ниже приведена "схема" подключений. 1011 символизирует информацию. (1. Нынешнее подключение. 2. Получение сигнала от пульта на компьютер. 3. Отправка сигнала с компьютера на контроллер) Также фотография пульта с обратной стороны. Заранее спасибо!
Ответ
Как уже выяснили в комментариях, это не Ethernet. И даже не com. По-моему, эта вещичка устроена так:
На средний провод подаётся постоянное напряжение, а кнопки замыкают соответствующие цепи, и тогда напряжение появляется на других линиях. Из интерфейсов, существующих в компьютере, здесь подойдёт только LPT-порт: центральный провод соединить с линией strobe и подать на него высокий уровень (логическую единицу). Другие линии соединить с любой из линий состояния и постоянно проверять на них логический уровень. Проблема в том, что на современных компьютерах такого порта давно уже нет. Поэтому я могу посоветовать брать свой контроллер (например, STM32F103), с его помощью проверять состояние кнопок. Это легко делается через порты GPIO. На компьютер можно передавать данные с помощью USB, который встроен в этот контроллер. Но USB - штука довольно сложная, поэтому вам легче будет воспользоваться преобразователем USB-UART, например, CP2102.
С mysql почти не работал. Какой тип данных лучше выбрать для чисел, имеющих какое-то кол-во знаков после запятой? Пример числа: 37.4044. Я так понял, в mysql несколько типов данных, которые подходят в данном случае. Но какой из них лучше выбрать?
Ответ
При работе с дробными значениями определите сначала для своей задачи требования к точности хранения и обработки. Если для выражения вроде (0.1+0.7)*10 вам допустимо получить что-то вроде 7.9999999999999991118 вместо 8 - значит вы можете использовать стандарт IEEE754, т.е. типы данных float или double. Разница между ними в диапазоне хранимых значений. Изначально типы разрабатывались для научных нужд, где важна производительность, но сами величины в выражениях могут в некоторых пределах искажаться при вычислениях. Значения всё равно не точны из-за ограничений измерительной аппаратуры. Если же речь идёт о, например, деньгах - то, разумеется, такие плавающие значения недопустимы и нужны типы данных с фиксированной запятой. Это decimal (так же известный как numeric) - вы при добавлении поля сами указываете, сколько знаков он может хранить и сколько из этих знаков являются дробной частью значения.
Пожалуйста, разъясните один момент: Если пользователь оформил подписку на платный контент а приложении, как программа проводит проверку того, что эта подписка до сих пор действительна, например, без интернета? Или приложение ориентируется по дате на устройстве (Что очень маловероятно). Или люди вообще не имеют доступа к платному контенту по подписке без интернета?
Ответ
Информация о наличии у юзера подписки получается путём запроса к playMarket. У него внутри какая-то там магия с кэшем и даже без интернета маркет будет отвечать что у юзера есть активная подписка. Сам в доках не находил инфы, но, думаю, этот кэш обновляется с достаточной переодичностью для того, чтобы и без интернета максимально неустаревшие данные выдавать и чтобы препятствовать покупке подписки, отмены оной, и пользованию приложением, думающим, что юзер всё ещё подписан. Лично я просто доверяю тому что отвечает маркет на мои запросы по поводу наличия чего-то купленного и не вдаюсь в детали актуализации этой информации маркетом
Есть буквы(слева в DGV). Я подгружаю в chart частоту букв в тексте, но у меня не вмещаются все подписи. Как уменьшить интервал или просто вернуть подписи?
Кусок кода, отвечающий за загрузку в chart: private void LoadGraph()
{ chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedBar;
var kek = hk.countDict.Keys.ToList();
kek.Sort();
foreach (var item in kek)
{
chart1.Series[0].Points.AddXY(item, hk.countDict[item]);
}
}
Ответ
Для того, чтобы отображались все метки, необходимо выставить значение интервала на нужной оси. Для графиков типа Bar в контроле Chart оси X и Y меняются местами, поэтому интервал нужно выставлять для оси X, если нужно видеть все подписи Bar-ам (по вертикальной оси). Небольшой демонстрационный фрагмент ниже. var rnd = new Random();
chart1.Series[0].ChartType = SeriesChartType.Bar;
string labels = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
foreach(var c in labels)
{
chart1.Series[0].Points.AddXY(c.ToString(), rnd.Next(0, 30));
}
chart1.ChartAreas[0].AxisX.Interval = 1;
Разумеется данные нужно подставить из вашего источника данных и оформить код как полагается, со всеми проверками на null и т.д.
Задача: Нужно определить находимся ли мы на главной странице или нет посредством JS.
Дано: url главной страницы всегда начинается с локали /ru/ или /en/. В чем проблема: не могу составить регулярку так, чтобы наше условие if срабатывало только когда у нас адрес такой http://www.exemple.com/ru/ или такой http://www.exemple.com/en/, но не, к примеру, такой http://www.exemple.com/ru/category/ Вот код: var urlpattern = new RegExp("\/(ru|en)\/");
if (urlpattern.test(window.location.pathname)) { };
Как итог:
Подскажите как правильно составить регулярное выражение?
Правильно ли я поступаю используя для сравнения пути метод test()?
Ответ
Используйте $ для проверки конца текста: var urlpattern = new RegExp("/(ru|en)/$");
Или так: var urlpattern = /\/(ru|en)\/$/;
Метод RegExp#test() вполне подходит для проверки на совпадение по регулярному выражению.
/ - прямой слеш (экранирование этого символа в конструкторе RegExp не требуется)
(ru|en) - подстроки ru или en
/ - прямой слеш (если он необязательный, надо просто добавить кванификатор ? (= 1 или 0 повторений): new RegExp("/(ru|en)/?$") или /\/(ru|en)\/?$/)
$ - конец строки.
См. демо регулярного выражения
var urls = ['http://www.exemple.com/ru/',
'http://www.exemple.com/en/',
'http://www.exemple.com/ru/category/',
'http://www.exemple.com/en/',
'http://www.exemple.com/ru'];
var rx = /\/(ru|en)\/?$/;
for (var url of urls) {
console.log(url, "=>", rx.test(url) ? "найден": "не найден");
}
Добрый день, пытаюсь подключиться к БД но в консоль выдаёт
QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available
drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7
в настоечном файле всё прописано
QT += core gui
QT += network
QT += sql
но ошибка не исчезает не знаю что делать.
Ответ
Согласно официальной инструкции, компиляция и установка драйвера qsqlmysql производится в три шага (при условии, что обозначенные там же в справке зависимости, как то пакет с заголовочными файлами MySql, уже установлены). Шаг первый. Открываем терминал и переходим в папку с проектом драйвера:
cd $QTDIR/qtbase/src/plugins/sqldrivers/mysql
Здесь "$QTDIR" - это путь к папке с установленным Qt. Шаг второй.
qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib
-lmysqlclient_r" mysql.pro
Здесь имеются нюанс: в системе может быть уже установлен Qt из пакетов. Удалять его вовсе не обязательно, но при сборке драйвера следует учитывать данную особенность. Поэтому прописываем полный путь именно к интересующей нас версии qmake. Например:
~/Qt/5.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/include"
"LIBS+=-L/usr/local/lib -lmysqlclient_r" mysql.pro
Далее правим путь в "LIBS" в соответствии с реальным местоположением libmysqlclient_r.so. Путь файла библиотеки можно посмотреть в том же Synaptic. В Ubuntu этот файл лежит в "/usr/lib/x86_64-linux-gnu" (возможно, что это справедливо и для Mint). Итого, пример:
~/Qt/5.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/include"
"LIBS+=-L/usr/lib/x86_64-linux-gnu -lmysqlclient_r" mysql.pro
Секция "INCLUDEPATH" по умолчанию предлагает путь "/usr/local/include", хотя на самом деле в Ubuntu заголовочные файлы MySql лежат в "/usr/include/mysql". Если указать данный путь, то при компиляции будет выведена ошибка:
fatal error: stdlib.h: Нет такого файла или каталога
Гугление по этой теме подсказало лишь одно верное решение: вообще не указывать "INCLUDEPATH". С чем связана подобная ошибка мне неизвестно, возможно кто-то сможет подсказать ответ. Тем не менее, результирующая команда для сборки может выглядеть так:
~/Qt/5.9/gcc_64/bin/qmake "LIBS+=-L/usr/lib/x86_64-linux-gnu -lmysqlclient_r" mysql.pro
Шаг третий Собственно, сборка
make
и установка драйвера
make install
Пишу мобильное приложение под Android на Delphi 10. Моя программа отправляет post и get запросы использую компонент THTTPClient. Скрипт на сервере принимает запросы в формате json, по этому при отправке запроса нужно обязательно указать в заголовке "Content Type: application/json". Дело в том, что у меня не получается изменить Content Type. При отправке Get запроса он изменятся, а при отправке Post запроса - нет.
Использую примерно такой код: procedure ThomeForm.Button1Click(Sender: TObject);
var
data: TStringList;
H: THTTPClient;
begin
data := TStringList.Create;
data.Add('{"phone":"' + HomeForm.Phone.Text + '"}'); h := THTTPClient.Create; h.ContentType := 'application/json';
h.Accept := 'application/json, text/plain, */*'; log.Text := h.Post('https://site.ru/api/phone', data).ContentAsString();
end;
Почему такое происходит и как это исправить?
Ответ
У HttpClient есть 4 перегруженных (overload) Post метода: // Post a raw file without multipart info
function Post(
const AURL: string;
const ASourceFile: string;
const AResponseContent: TStream = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload; // Post TStrings values adding multipart info
function Post(
const AURL: string;
const ASource: TStrings;
const AResponseContent: TStream = nil;
const AEncoding: TEncoding = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload; // Post a stream without multipart info
function Post(
const AURL: string;
const ASource: TStream;
const AResponseContent: TStream = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload; // Post a multipart form data object
function Post(
const AURL: string;
const ASource: TMultipartFormData;
const AResponseContent: TStream = nil;
const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
Первый и третий методы отправляют данные как есть, второй метод (которым вы воспользовались) отправляет данные как application/x-www-form-urlencoded, четвёртый метод отправляет данные как multipart/form-data Таким образом, вам нужно использовать первый или третий метод, если вы хотите отправлять сырые данные с указанием своего Content-Type. Пример, с использованием третьего метода: var
data: TStringStream;
H: THTTPClient;
begin
data := TStringStream.Create;
try
data.WriteString('{"phone":"' + HomeForm.Phone.Text + '"}'); h := THTTPClient.Create;
try
h.ContentType := 'application/json';
h.Accept := 'application/json, text/plain, */*';
log.Text := h.Post('https://site.ru/api/phone', data).ContentAsString();
finally
h.Free;
end;
finally
data.Free;
end;
end;
Нужно реализовать нисходящую сортировку слиянием методом абстрактного обменного слияния. Вот функция абстрактного обменного слияния: template
void merge(Item a[], int l, int m, int r) {
int i, j;
static Item aux[maxN];
for (i = m + 1; i > l; i--)
aux[i - 1] = a[i - 1];
for (j = m; j < r; j++)
aux[r + m - j] = a[j + 1];
for (int k = l; k <= r; k++)
if (aux[j] < aux[i])
a[k] = aux[j--];
else
a[k] = aux[i++];
}
Как сделать эту сортировку нисходящей, то есть рекурсивной?
Ответ
Я немного изменил вашу функцию. Среднее значение вычисляется внутри. Принцип работы алгоритма таков, что сначала исходный массив разбивается на два других. Каждый из них также разобьется ещё на два. Это будет продолжаться до тех пор, пока длина каждого подмассива будет равна 1. template
void merge(Item a[], int l, int r) { if (abs(r - l) <= 1) return; //конец рекурсивных вызовов
int i, j;
int m = (l + r) / 2;
merge(a, l, m); //вызов для левой части
merge(a, m+1, r); //вызов для правой части
static Item aux[1000];
for (i = m + 1; i > l; i--)
aux[i - 1] = a[i - 1];
for (j = m; j < r; j++)
aux[r + m - j] = a[j + 1];
for (int k = l; k <= r; k++)
{
if (aux[j] < aux[i])
a[k] = aux[j--];
else
a[k] = aux[i++];
}
}
Замечание: при вызове функции необходимо указывать длину массива - 1. То есть: int main()
{
int a[N];
merge(a, 0, N-1);
}
Столкнулся с задачей, что нужно переместить файл из директории пользователя во временную директорию программы. Для этой задачи было найдено два метода:
File.renameTo() — стандартный вариант перемещения файлов.
Files.move() — более новый вариант перемещения файлов.
В документации у первого метода было слишком много "но" и он мог завершиться без результата, но и без ошибки. Поэтому было решено перейти ко второму варианту. На сколько я понял, если файл находится на том же разделе, что и новое место положение, происходит переименование и это занимает секунду.
Вопроса, фактически, два:
Какой самый устойчивый способ переместить файл на другой раздел и безопасно ли это делать методом move?
Как этот способ работает "под капотом" (будет ли какое-то специфическое переименование или файл просто скопируется)?
Ответ
Если посмотреть на реализацию метода move, то мы увидим следующий код public static Path move(Path source, Path target, CopyOption... options)
throws IOException
{
FileSystemProvider provider = provider(source);
if (provider(target) == provider) {
// same provider
provider.move(source, target, options);
} else {
// different providers
CopyMoveHelper.moveToForeignTarget(source, target, options);
}
return target;
}
Как видно из кода есть два варианта:
Если перенос осуществляется в пределах одного раздела, то происходит перенос файла
Если перенос осуществляется на другой раздел, то происходит копирование файла с последующим удалением исходного /**
* Simple move implements as copy+delete for use when source and target are
* associated with different providers
*/
static void moveToForeignTarget(Path source, Path target,
CopyOption... options) throws IOException
{
copyToForeignTarget(source, target, convertMoveToCopyOptions(options));
Files.delete(source);
}
Для обеспечения надежности вы можете использовать ключ ATOMIC_MOVE - он гарантирует, что операция перемещения будет произведена атомарно, то есть операция либо выполняется целиком, либо не выполняется вовсе.
Добрый день. Вопрос такого характера:
Я, нахожу класс для чтобы задать свойство элементу if($('.class')) {
$('.class').css('top', 10);
}
Но при этом мне нужно еще одно условие, чтобы на странице не было другого класса if($('.class') && !$('.class2') ) {
$('.class').css('top', 10);
}
Пробовал и так $('.class1' && !'.class2')
Как сделать такое условие, я по разному пробовал не выходило. Объясните пожалуйста.
Ответ
Селектор jQuery $(...) всегда возвращает объект-обертку вокруг некоторого количества DOM-элементов, даже если этих элементов ноль. Результат селектора, как булевское значение, соответствует true. Вам следует проверять количество найденных элементов. if ($('.class').length > 0 && $('.class2').length == 0) {
$('.class').css('top', 10);
}
или эквивалентное if ($('.class2').length == 0) {
$('.class').css('top', 10);
}
так как в отсутствие элементов с классом class операция $('.class').css('top', 10); ничего не делает.
Пользуюсь сертификатом от LetsEncrypt, подключил скрипт на автопродление, но вот боюсь, что он не продлится автоматически и на всех сайтах однажды появится ошибка безопасности. В анализе с помощью sslanalyzer.comodoca.com поле Valid From должно каждый день обновляться (становиться текущей датой) или дата изменится на текущую только когда закончится срок действия сертификата и сработает автопродление?
Ответ
боюсь, что он не продлится автоматически
проконтролируйте. если до даты окончания действия сертификата осталось меньше месяца (только в таком случае letsencrypt согласится перевыпустить сертификат), а то (не знаю что), что вы запускаете для запроса нового сертификата, отработало, но сертификат остался прежним — пора разбираться с этим самым тем (не знаю чем).
ремарка: не имею ни малейшего представления, что это за сайт sslanalyzer.comodoca.com, и какую информацию он предоставляет. но если речь про две даты: когда сертификат стал/станет действующим (notbefore), и когда сертификат прекратил/прекратит быть действующим (notafter), то они записаны непосредственно в сертификате и, конечно, не меняются. получаете новый сертификат — у него будут новые даты начала и конца действия. посмотреть их можно с помощью программы openssl примерно так: $ openssl x509 -noout -startdate -enddate -in файл.с.сертификатом
notBefore=Jun 7 15:26:28 2017 GMT
notAfter=Aug 30 15:11:00 2017 GMT
или, скачав сертификат с действующего сервера:
http-сервер, порт 443 (https): $ : | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -startdate -enddate
notBefore=Jun 7 15:26:28 2017 GMT
notAfter=Aug 30 15:11:00 2017 GMT
smtp-сервер, порт 25 (smtp, starttls): $ : | openssl s_client -connect smtp.gmail.com:25 -starttls smtp 2>/dev/null | openssl x509 -noout -startdate -enddate
notBefore=Jun 7 15:35:24 2017 GMT
notAfter=Aug 30 15:11:00 2017 GMT
imap-сервер, порт 143 (imap, starttls): $ : | openssl s_client -connect imap.yandex.ru:143 -starttls imap 2>/dev/null | openssl x509 -noout -startdate -enddate
notBefore=Apr 28 17:54:16 2016 GMT
notAfter=Apr 28 17:54:16 2018 GMT
imap-сервер, порт 993 (imaps) $ : | openssl s_client -connect imap.gmail.com:993 2>/dev/null | openssl x509 -noout -startdate -enddate
notBefore=Jun 7 15:28:03 2017 GMT
notAfter=Aug 30 15:11:00 2017 GMT
на форме фильтр + грид данные с бэка забираю через fetch полученными данными обновляется грид запрос довольно тяжелый / долгий проблема возникает когда пользователь генерит новый запрос до завершения предыдущего контент в гриде обновляется несколько раз можно как то прервать / отказаться от "устаревшего" запроса? P.S.
обертывание fetch в clearTimeout / setTimeout в данной ситуации не спасает P.S.S.
или както проверять является ли полученный данные результатом последнего promis'а? UPDATE страница на ReactJS публикация кода ничего не даст, т.к. проблема общего плана ситуация в том, что нет кнопки "НАЙТИ", запрос генерится при каждом "чихе" в фильтре фильтр огромный из 10ков полей и выпадающих списков дисейблить его при каждом запросе не получится по идеалогическим соображениям клиента вижу единственный вариант это отказываться или игнорировать устаревшие запросы но хотел поискать BEST PRACTICES UPDATE2 class View extends Component { ... updateItems(data) {
self.state.timeoutItems && clearTimeout(self.state.timeoutItems);
self.state.timeoutItems = setTimeout(() => {
self.props.onGetItems(self.calcParams());
}, config.timeoutItems );
}
}
export default connect(
state => ({
items: state.items
}),
dispatch => ({
onGetItems: (o) => {
dispatch(getItems(o));
}
})
)(View);
... export const getItems = (o = {}) => dispatch => { ... fetch(url, {
method: 'GET',
headers: {
"Content-type": "application/json",
"Accept": "application/json"
},
})
.then( (response) => response.json() )
.then((data) => { ==>> (1) <<== dispatch({ type: 'FETCH_ITEMS_SUCCESS', data: data });
})
.catch((error) => {
console.log('Request failed', error);
});
}
можно ли в точке (1) определить к какому promise относится полученный результат?
Ответ
На текущее время нативно отменить fetch нельзя, это потому что он использует механизм Promise-ов, в которых тоже нет механизма прерывания. Поэтому приходится ухитряться и писать костыли Есть библиотека axios, тоже использует Promise, правда работает вроде все еще на стандартном XMLHttpRequest, но возможность отмены там есть var CancelToken = axios.CancelToken;
var source = CancelToken.source(); axios.get('/user/12345', {
cancelToken: source.token
}).catch(function(thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// handle error
}
}); // cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');
Если хотите использовать нативный fetch придется пока писать свою реализацию отмены запроса (да и то, это не будет настоящей отменой запроса, потому что ответ все равно придет, просто вы его проигнорируете) UPD Дискасс на эту тему
Добрый день, задача по олимпиадному программированию из егэ этого года. На вход подается целое положительное число N, не превышающее 10000, и последовательность из N целых положительных чисел, не превышающих 1000. Программа должна выводить число пар чисел, произведение чисел в которых кратно 10. При этом числа, произведение которых мы проверяем на кратность, не обязаны стоять рядом: пара может составляться и из чисел, взятых с разных концов последовательности.
Пример входных данных: 4
2 5 7 4
Пример выходных данных: 2
Здесь подходят пары (2;5) и (5;4). Решение перебором очевидно, но меня интересует решение эффективное по памяти и по времени. Под эффективностью по времени и по памяти в егэ подразумевают следующее:
Программа считается эффективной по времени, если время работы программы пропорционально количеству пар чисел N, т. е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Очень интересно разобраться с этой задачей, буду благодарен за любую помощь. Язык программирования не важен, я хочу понять сам алгоритм.
Ответ
Заводим массив a на 10 элементов - по остаткам от деления на 10.
Для каждого считанного числа x увеличиваем a[x%10]
Считаем сумму:
Умножаем a[0] на сумму всех остальных элементов
Умножаем a[5] на значения по чётным индексам кроме 0
т. к. произведение двух кратных 10 чисел тоже делится на 10, a[0] * (a[0]-1)
Бррр... А теперь упрощаем:
a0 - количество чисел, которые делятся на 10
b0 - количество чисел, которые не делятся на 10
a2 - количество чисел, которые делятся на 2, но не на 10
a5 - количество чисел, которые делятся на 5, но не на 10
Обращаю внимание, что в b0 входят a2 и a5 Ответ: a0*(a0-1+b0) + a2*a5 И ещё упрощаем: a0-1+b0 - это n-1 PS: В соответствии с требованиями, надо не держать массив в памяти, а обрабатывать по мере чтения.
Есть строка, в которой есть цифры, буквы и знаки препинания. Например: г. Москва, ул. Ленина д.5. Надо проверить, есть ли в ней символы, относящиеся к управляющим символам ASCII таблицы(коды с 0х00 до 0х1F и 0x7F). Вообще не могу понять как в моей строке искать эти символы. Не перечислять же мне их вручную, а потом посимвольно сравнивать...
Ответ
Надо проверить, есть ли в ней символы, относящиеся к управляющим символам ASCII таблицы(коды с 0х00 до 0х1F).
Char.IsControl тут не подойдёт, так как этот метод проверяет также наличие управляющих символов всей таблицы Юникода. Нужно использовать LINQ. s.Any(c => (c >= 0 && c <= 31) || c == 127) проверит наличие требуемых символов в тексте, а s.Where(c => (c >= 0 && c <= 31) || c == 127).ToList() вернёт их список: var s = "\x08
";
var result = s.Any(c => (c >= 0 && c <= 31) || c == 127);
Console.WriteLine(result); // => True
var result2 = s.Where(c => (c >= 0 && c <= 31) || c == 127).ToList();
Console.WriteLine("'{0}'", string.Join("';'", result2));
Result: True
'';' ';'
';'
'
См. демо Можно и регулярным выражением: var hasAsciiControlChr = Regex.IsMatch(s, @"[\u0000-\u001F\u007F]");
См. C#-демо
Всем Здрасте,
Есть задача: прилинковать С++ библиотеку без лишних зависимостей, то есть: Есть библиотека lib1 эта библитека зависит от библиотеки lib2.
Есть проект proj1 и proj2.
Они оба зависят от и используют lib1 Но proj1 использует функционал lib2 соответственно зависимость от этой библиотеки ему нужна.
А proj2 не использует функционал lib2 соответственно зависимость от этой библиотеки ему не нужна Как прилинковать lib1 в proj2 и исключить зависимости от lib2?
Ответ
Библиотека - это просто архив объектных файлов. В "традиционном" режиме линковка библиотек делается с точностью до индивидуальных объектных файлов. Если при линковке lib1 в proj2 удастся аккуратно "выхватить" из lib1 только те объектные файлы, которые не ссылаются на символы из lib2, то линковать lib2 в proj2 не понадобится вообще. Задача решена. Для этого обычно нужно, чтобы объектные файлы в lib1 были продуманно/аккуратно организованы и довольно тонко гранулированы. Если же какие-то символы из lib2 все таки притянутся в proj2, то ничего не поделаешь: придется либо линковать lib2 в proj2, либо писать "заглушки" для этих символов.
Одна из Activity отображает данные, которые не должны оставаться "без присмотра".
Мучал флаги и атрибуты - не выходит.
Вызывал finish() в onPause() - сама активность закрывается, но в таске висит её скриншот и данные можно прочесть.
Ответ
Оказалось можно скрыть контент в превью флагом окна @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.main);
}
У меня есть строка вида "{0:.2f}sec/{1}".format(my_variable, other_variable)
my_variable это float. Я хочу чтобы она занимала 5 символов.
Для обычной переменной я сделал бы так: "{0: <5}".format(my_variable)
Я пробовал: "{0:.2f <5} }sec/{1}".format(my_variable, other_variable)
"{0:.2f: <5} }sec/{1}".format(my_variable, other_variable)
но вылетает ValueError: Invalid conversion specification
Как сделать так, чтобы my_variable занимала 5 символов?
Примеры вывода: "23.45"
" 2.34"
" 0.30"
Есть основной класс class A { }
Есть шаблон для дженерик синглтонов: class Singleton : A where T : A { public string Name = typeof (T).ToString(); private static T instance;
public static T Instance {
get {
return instance ?? (instance = Activator.CreateInstance());
}
} public void TestMethod() {
Console.WriteLine("My name is " + Name);
}
}
Есть пачка классов от него унаследованных: class Test1 : Singleton { }
class Test2 : Singleton { }
class Test3 : Singleton { }
class Test4 : Singleton { }
Вопрос: как можно в основной программе иметь возможность всегда пробежаться по им всем и обратиться к их методу/полю/свойству? чтобы не пришлось постоянно писать такие пачки: Test1.Instance.TestMethod();
Test2.Instance.TestMethod();
Test3.Instance.TestMethod();
Test4.Instance.TestMethod();
Или в силу того, что это получаются разные типы - это невозможно?
Ответ
Как я понял, один из путей сделать интерфейс с общими методами interface ICommon {
void TestMethod();
// ...
}
синглтон класс будет таким class Singleton : A, ICommon where T : A { ...
а в основной программе сложить в список и за счет общего интерфейса можно уже манипулировать всеми экземплярами: List testList = new List(); testList.Add(Test1.Instance);
testList.Add(Test2.Instance);
testList.Add(Test3.Instance);
testList.Add(Test4.Instance); foreach (var test in testList) {
test.TestMethod();
}
Здравствуйте. Есть текст моя программа делит его на предложения.
Но из-за возможных ссылок она будет делить текст на предложения не правильно.
Я нахожу точки по средству цикла и charAt также поступаю и с !!! ... И прочим. Насколько я понял мне нужно найти возможные www. http https .ru ....
Как мне найти все ссылки в строке и узнать их местоположение что бы когда я искал точки и другие знаки не попал на эту ссылку?
Ответ
Ссылки, на сколько мне известно, не содержат пробелов. Можно воспользоваться этим свойством и найти все точки, которые рядом с ними. Это будут заведомо точки не входящие в url.
Данный способ, не может обеспечить точное разделение на предложения, но по крайней мере, исключит ложные срабатывания на ссылках. String text = "Насколько я понял мне нужно найти возможные" +
" www. http https .ru .... Как мне найти все ссылки в " +
"строке и узнать их местоположение что бы" +
" http://www.yandex.ru/" +
" когда я искал точки и другие знаки не попал на эту ссылку?"; for (String str : text.split("([\\s][.])|([.][\\s])"))
System.out.println(str);
Вывод будет таковым:
Насколько я понял мне нужно найти возможные www
http https
ru
..
Как мне найти все ссылки в строке и узнать их местоположение что бы http://www.yandex.ru/ когда я искал точки и другие знаки не попал на эту ссылку?
Причем чтобы нормально отображалось и в почтовых клиентах а-ля Thunderbird и в веб-сервисах. Везде пишут, что 4, но это инфа за 2015-й. Может, уже и на 5 нормально. Подскажите, пожалуйста.
В программе есть постраничный вывод данных из БД в DataGrid. Данные подгружаются асинхронно порциями при смене номера текущей страницы. Сейчас сделано так, что в сеттере CurrentPage вызывается LoadProducts, но т.к. нельзя написать await, то метод выполняется синхронно. Какой такое должно реализовываться? public int CurrentPage
{
get { return _currentPage; }
set
{
_currentPage = value;
LoadProducts();
OnPropertyChanged();
}
} async void LoadProducts()
{
// Получение данных из БД
}
Ответ
Никак. Свойство является по существу полем с небольшой довеской. При использовании поля никто не предполагает, что оно будет медленным, асинхронным, или хуже того сможет зависнуть или бросить исключение (если только не присваивать неправильное значение). Используйте обыкновенную async-функцию: public int CurrentPage
{
get { return _currentPage; }
} public async Task SwitchToPage(int value)
{
// Получение данных из БД
_currentPage = value;
OnPropertyChanged(nameof(CurrentPage));
}
Если речь идёт об интерфейсе, тогда, возможно, имеет смысл такое изменение: public int CurrentPage
{
get { return _currentPage; }
set
{
if (_currentPage == value) return;
_currentPage = value;
SwitchToPage(value); // игнорируем возвращаемое значение
OnPropertyChanged(); // загрузка произойдёт в фоне
}
} async Task SwitchToPage(int value)
{
try
{
IsCurrentPageEditable = false;
// Получение данных из БД
}
catch (тут исключения)
{
// тут обработка
}
finally
{
IsCurrentPageEditable = true;
}
} bool _isCurrentPageEditable = true;
public bool IsCurrentPageEditable
{
get { return _isCurrentPageEditable; }
private set { _isCurrentPageEditable = value; OnPropertyChanged(); }
}
и в UI
На php.net отсутствует информация по формату заголовков header.
В спецификации HTTP/1.0 указано: 503 Service Unavailable В сети встречаются оба формата записи: header('HTTP/1.0 503 Service Unavailable');
header('HTTP/1.0 503 Service Temporarily Unavailable');
Так же интересует корректность этих заголовков: header('HTTP/1.0 400 Bad Request');
header('HTTP/1.0 404 Not Found');
Ответ
По стандарту – "503 Service Unavailable" Но вы вольны использовать любую формулировку или вовсе оставить только код 6.1.1 Status Code and Reason Phrase
The Status-Code element is a 3-digit integer result code of the
attempt to understand and satisfy the request. These codes are fully
defined in section 10. The Reason-Phrase is intended to give a short
textual description of the Status-Code. The Status-Code is intended
for use by automata and the Reason-Phrase is intended for the human
user. The client is not required to examine or display the Reason-
Phrase
(курсив мой) 6.1.1 Код состояния и поясняющая фраза
Код состояния — это трехциферный код, обозначающий попытку понять и ответить на запрос. Подобные коды подробно определяются в секции 10. Смысл поясняющей фразы в том, чтобы дать короткое текстовое описание кода состояния. Предполагается, что код состояния будет обрабатываться машиной, а поясняющую фразу будет читать человек. От клиента не требуется, чтобы он обрабатывал или отображал поясняющую фразу
Есть одна интересная оговорка о разнице между временными и постоянными поломками:
Except when responding to a HEAD request, the
server SHOULD include an entity containing an explanation of the
error situation, and whether it is a temporary or permanent
condition. User agents SHOULD display any included entity to the
user
На все запросы кроме HEAD [к ответу со статусом 5хх] сервер ДОЛЖЕН добавлять данные о ситуации, в которой произошла ошибка, а также о том, является проблема постоянной или временной. Пользовательские агенты [например, браузеры] ДОЛЖНЫ отображать пользователю любые приложенные данные.
Итог:
Вам не стоит беспокоиться о формулировке поясняющей фразы. Почти наверняка пользователь её не увидит, а программы вообще не должны её учитывать.
Вы должны приложить к ответу 5xx данные о том, почему произошла ошибка и является ли она постоянной или временной. Наверняка пользователь увидит эти данные.
По субъективному опыту, хорошим тоном в GET-запросах является специальная страница, которая говорит о том, что случилась какая-то ошибка, но о ней уже известно и идёт работа над тем, чтобы её исправить.
Есть веб сервер , который после успешной аутентификации отдает 2 токена (доступа и обновления) . Где их безопасно хранить? Shared Preferences с private mode не кажется мне лучшей идеей.
Ответ
Самый лучший вариант - использовать системный менеджер аккаунтов, который предоставляет возможность безопасно хранить данные пользователя и даже использовать их в нескольких приложениях одновременно. Есть замечательные статьи на эту тему: Часть 1 - https://habrahabr.ru/company/e-Legion/blog/206210/ Часть 2 - https://habrahabr.ru/company/e-Legion/blog/216857/ А также документация - https://developer.android.com/training/id-auth/custom_auth.html
Приветствую. Перечитал по паттерну Model-View-ViewModel немало статей, но до конца пока что не разобрался. Подскажите, пожалуйста, как его правильно использовать на конкретном примере ниже. У меня есть свой WCF-сервис заметок, у которого есть стандартные функции: создать заметку, редактировать, удалить, получить заметки. Сейчас я пишу для него клиент на WPF и хочу применить паттерн MVVM. Расскажите, пожалуйста, что именно должен делать каждый компонент (Model, View, ViewModel). Выводить заметки хочу в Datagrid
Ответ
Модель представляет собой объект домена - короче говоря, то, что вы получаете из WCF. Модель представляет фактические данные и / или информацию, с которой мы имеем дело. View - это представление данных. В MVVM содержит поведение, события и привязки данных, которые в конечном итоге требуют знания базовой модели и модели просмотра. Короче - это ваш XAML UserControl. Viewmodel - это концепция сохранения нюансов представления (View) отдельно от модели. С одной стороны он обрабатывает все привязки событий, а с другой - знает, как построить модель и вызвать службу WCF. View: ViewModel: public class OrderViewModel : BindableBase
{
public OrderViewModel( IWcfPostService postService )
{
this.LineItems = new ObservableCollection(
postService.GetPostsList() );
this.SubmitCommand = new DelegateCommand(
this.OnSubmit, this.CanSubmit );
} public ObservableCollection LineItems { get; private set; } public ICommand SubmitCommand { get; private set; } private void OnSubmit(object arg) {...}
private bool CanSubmit(object arg) { return true; }
}
Model: public class PostModel : INotifyPropertyChanged
{
private string _author;
private string _text; public string Author
{
get { return _author; }
set
{
_author = value;
RaisePropertyChanged("Author");
}
} public string Text
{
get { return _text; }
set
{
_text = value;
RaisePropertyChanged("Text");
}
} protected void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
} public event PropertyChangedEventHandler PropertyChanged;
}
Есть сайт, интересует вопрос как при маленьком разрешении увеличить размер видео на фоне, чтобы было на всю высоту и ширину экрана.
http://tvarinskydesign.16mb.com/pura/ Заранее благодарен за любую помощь :)
Ответ
Пропорции видео нужно высчитывать, а без javascript тут не обойтись.
Для таких случаев я использую вариант на jQuery - vide.js
Плагин высчитывает пропорции и положение видео так, чтобы оно полностью "заполняло" необходимое пространство.
!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b("object"==typeof exports?require("jquery"):a.jQuery)}(this,function(a){"use strict";function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,":").replace(/\s*,\s*/g,",").split(","),h=0,g=f.length;g>h&&(c=f[h],-1===c.search(/^(http|https|ftp):\/\//)&&-1!==c.search(":"));h++)b=c.indexOf(":"),d=c.substring(0,b),e=c.substring(b+1),e||(e=void 0),"string"==typeof e&&(e="true"===e||("false"===e?!1:e)),"string"==typeof e&&(e=isNaN(e)?e:+e),i[d]=e;return null==d&&null==e?a:i}function c(a){a=""+a;var b,c,d,e=a.split(/\s+/),f="50%",g="50%";for(d=0,b=e.length;b>d;d++)c=e[d],"left"===c?f="0%":"right"===c?f="100%":"top"===c?g="0%":"bottom"===c?g="100%":"center"===c?0===d?f="50%":g="50%":0===d?f=c:g=c;return{x:f,y:g}}function d(b,c){var d=function(){c(this.src)};a('').load(d),a('').load(d),a('').load(d),a('').load(d)}function e(c,d,e){if(this.$element=a(c),"string"==typeof d&&(d=b(d)),e?"string"==typeof e&&(e=b(e)):e={},"string"==typeof d)d=d.replace(/\.\w*$/,"");else if("object"==typeof d)for(var f in d)d.hasOwnProperty(f)&&(d[f]=d[f].replace(/\.\w*$/,""));this.settings=a.extend({},g,e),this.path=d,this.init()}var f="vide",g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:"50% 50%",posterType:"detect",resizing:!0};e.prototype.init=function(){var b,e=this,g=c(e.settings.position),h="";e.$wrapper=a("
В фоновом режиме приложение отправляет запросы на сервер, в цикле.
По задумке если ответ сервера содержит 1, надо отправить пуш уведомление.
Код работает но оповещение нельзя закрыть и при переходе по уведомлению оно не пропадает.И еще, когда сервер выводит 1 , оповещения приходят до тех пор пока 1 не сменится 0, как можно это исправить? public class MyService1 extends Service {
public MyService1() {
}
private final int NOTIFICATION_ID = 38;
private NotificationManager nn;
String q = "http://site/new.php";
public void onCreate(){
super.onCreate();
new JSON().execute(q);
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
} public class JSON extends AsyncTask { @Override
protected String doInBackground(String... params) { HttpURLConnection connection = null;
BufferedReader reader = null;
while (true) {
onCreate();
try { URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect(); InputStream stream = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(stream)); StringBuffer buffer = new StringBuffer(); String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
return buffer.toString(); } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
} @Override
protected void onPostExecute(String result) {
super.onPostExecute(result); if (result.contains("1")) { Notification.Builder builder = new Notification.Builder(getApplicationContext());
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
builder
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_action_name)
.setLargeIcon(BitmapFactory.decodeResource(getApplication().getResources(),R.drawable.ic_action_name))
.setTicker("new messsege")
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentTitle("Not")
.setContentText("put this mess");
Notification notification = builder.build(); notification.defaults = Notification.DEFAULT_VIBRATE; startForeground(37,notification);
} else { }
}
}
}
Ответ
Во-первых, то, что Вы называете "пуш уведомлением" называется нотификацией или уведомлением. Push-сообщение -- это порция данных, которую Вам может прислать сервер. В вашем примере push-сообщения не используются. Во-вторых, Вы не просто показываете нотификацию, а запускаете foreground сервис, в таком случае нотификацию нельзя просто смахнуть свайпом, ведь она связана с высоко приоритетной выполняющейся задачей. Если Вы действительно хотите запускать foreground сервис, то нотификация пропадёт только когда Ваше приложением вызовет stopForeground или когда пользователь убьёт его в настройках или по долгому тапу, если оболочка это позволяет (не через кнопку последних приложений). В-третьих, если Вам нужно просто показать нотификацию, то необходимо воспользоваться NotificationManager, примеры тут и тут. С его же помощью нотификацию также можно удалить программно. Обратите внимание на установку PendingIntent в примерах, если необходимо что-то делать по нажатию на нотификацию.
Когда ListView перестает влазить в экран, он перекрывает fab, после чего кликнуть по fab уже не получается (пока ListView не "дошел" до fab - fab кликабелен). Все клики идут на элементы списка. На скрине видно, как разделители идут поверх fab.
Gradle compile 'com.android.support:design:25.3.1'
XML
Фрейм используется для фрагментов @Override
public void setFragment(Fragment f) {
getFragmentManager()
.beginTransaction()
.replace(R.id.main_frame, f)
.commit();
Проблема только на эмуляторе (Genymotion, на нативном попробовать не могу). Эмулируется Nexus S API 16 480 x 800. Физическое устр-во на котором все работает: Xiaomi API 21 1080 x 1920
Ответ
Да, есть такая проблема до API 21. Суть её в том, что по факту, в вашей разметке FAB находится в контейнере на 0 уровне и все последующие добавляемые элементы перекрывают его (т.к. отрисовка детей в контейнере происходит по порядку их добавления, то самые последние имеют максимальный z-индекс) и, соответственно, клики не проходят. При этом с API 21 FAB всегда выше любой вьюхи в одном с ним контейнере. У вас 3 варианта:
Установить программно z-индекс для FAB:
ViewCompat.setZ(fab, 42);
Переделать разметку так, чтобы FAB был всегда выше в иерархии чем фрагменты. Например сделав ещё один FrameLayout внутри текущего и в него фрагменты добавлять.
Создать свой контейнер в котором реализовать свой порядок отрисовки детей. Пример тут: https://stackoverflow.com/a/39161932/3212712
Данный код переводит в верхний регистр первых букв слова, но почему то не работает с кириллицей Допустим: ivanov иван, вывод: Ivanov иван
function foobar(str) {
return str.replace(/\b(.)/g,
function(s) {
return s.toUpperCase();
}
)
}
Ответ
\b не понимает кирилицу, function foobar(str) {
return str.replace(/(^(.)|\s(.))/g,
function(s) {
return s.toUpperCase();
}
)
}
Как при определенных размерах использовать container(в bootstrap), а при меньших(телефоны, читалки, планшеты) - container-fluid? Нужно при больших разрешениях использовать отступы по бокам страницы, а при маленьких - их сносить?
Ответ
Вообще то можно создать например такие классы при разных разрешениях как делает bootstrap, и дать эти классы блокам так как вам нужно: @media (max-width: 767px){
no-padding-xs{
padding: 0;
}
no-margin-xs{
margin: 0;
}
}
@media (max-width: 991px){
no-padding-sm{
padding: 0;
}
no-margin-sm{
margin: 0;
}
}
@media (max-width: 1199px){
no-padding-md{
padding: 0;
}
no-margin-md{
margin: 0;
}
}
@media (min-width: 1200px){
no-padding-lg{
padding: 0;
}
no-margin-lg{
margin: 0;
}
}
А то что вы хотите резные классы для разных разрешениях, это только на js можно сделать, и то это плохой вариант.
Нужно решить следующую задачу:
Имеется массив, содержащий произвольные числа:
[3], [5], [2], [6] ....
Нужно найти суммы всех возможных сложений его элементов и записать их в другой массив. Т.е. получается если в массиве 4 элемента, другой массив должен состоять из 16.
Как реализовать алгоритм?
Ответ
То есть вам нужно получить все возможные подмножества данного множества. Самый простой вариант - для множества из N элементов берем число из N битов, и проходим по всем возможным значениям числа (для 4 элементов - от 0000 до 1111, т.е. от 0 до 15). Далее для каждого числа суммируем элементы, соответствующие единицам - типа, для 0011 - третий и четвертый (понятно, что удобнее и логичнее считать с младших битов, так что нулевой и первый :)) Думаю, перевести на конкретный язык проблем не составит. Если задача конкретно в суммах - то я бы смотрел на коды Грея, тогда каждое следующее значение получается путем прибавления или вычитания только одного элемента.