Страницы

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

среда, 25 декабря 2019 г.

Как сделать так, что бы активность автоматически запускалась при включении телефона?

#android #android_sdk


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


Ответы

Ответ 1



Используйте Broadcast Receiver - механизм, реагирующий на широковещательные сообщения. Вкратце - широковещатеьное сообщение может быть например каким нибудь системым событием, на которое может отреагировать BroadcastReceiver установленного приложения. Включение телефона является широковещательным сообщением, так что можно легко обрабатывать это событие

Как использовать urlib для адреса с кириллицей

#python #python_3x #urllib


Как правильно использовать urlib.request для получения кода страницы, при условии,
что в URL есть кириллица

UPD. Есть функция:

def get_html(url):
    return urllib.request.urlopen(url).read()


Она отдает html-код страницы по URL (да-да, кэп).
Она работает ровно до того момента как в заголовке появляется кириллица и интерпретатор
отдает ошибку: 


  UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-18: ordinal
not in range(128)

    


Ответы

Ответ 1



В рамках протокола HTTP не-ASCII символы в URI не допускаются. Например кириллица может быть введена и отображена в адресной строке браузера, но браузер переводит эту строку запроса (в виде IRI) в правильный, с точки зрения протокола HTTP URI. Соответственно для имени хоста применяется Punycode, а для остальных компонентов URL-кодирование. В вашем случае можно воспользоваться дополнительной функцией для перевода из кириллического IRI в ASCII URI from urllib.parse import quote, urlsplit, urlunsplit def iri_to_uri(iri): parts = urlsplit(iri) uri = urlunsplit(( parts.scheme, parts.netloc.encode('idna').decode('ascii'), quote(parts.path), quote(parts.query, '='), quote(parts.fragment), )) return uri И вызывать вашу функцию так: content = get_html(iri_to_uri(url))

Работа со звуком в приложениях Windows 10

#c_sharp #net #uwp #windows_10


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


Ответы

Ответ 1



Вкратце: да, нужно использовать BackgroundMediaPlayer плюс имплементировать IBackgroundTask. Это входная точка для работы приложения, когда оно свернуто. Позволит управлять произведением музыки в свернутом состоянии. У Microsoft есть официальный пример.

Фильтрация файлов при выполнении scp

#bash #ssh #scp


Хочу скопировать с удаленного компьютера все файлы - с каким-нибудь фильтром. Например,
по названию: содержащие слово file как-то так:

$ scp user@192.168.1.10:/home/user/$(ls | grep file)


Не работает. Как можно это сделать - без копирования всего содержимого папки и фильтрации
на локальном компьютере?
    


Ответы

Ответ 1



вложенная оболочка (определяемая конструкцией $()) будет запущена на локальной машине. поэтому результаты выполнения команды ls в данном случае вряд ли могут быть полезны. копировать в текущий каталог файлы, содержажие слово file, можно, например, так: $ scp user@192.168.1.10:/home/user/*file* . искомое слово можно поместить в переменную: $ v=file scp user@192.168.1.10:/home/user/*$v* . более того, в ту же переменную можно поместить и поисковые квантификаторы: $ v='*file*' scp user@192.168.1.10:/home/user/$v .

Как использовать сообщения в unicode в assert-методах?

#python #кодировка #юнит_тесты #unicode


Не могу добиться, чтобы методы assert корректно выводили сообщения в юникоде:

# coding=utf-8
from unittest import TestCase

class Example(TestCase):

    def test_mcve(self):
        message = u'Привет, мир!'
        print message
        self.assertTrue(False, message)


Результат выполнения:

Testing started at 17:07 ...
Привет, мир!

Failure
Traceback (most recent call last):
  File "/home/n.volynkin/example/mcve.py", line 9, in test_mcve
    self.assertTrue(False, message)
AssertionError: \u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0438\u0440!


То есть просто так строка корректно выводится в stdout, а из ассерта - ломается юникод.
Как получить нормальные строки?
    


Ответы

Ответ 1



Совершенно неожиданно я нашёл ответ: class Example(TestCase): def test_mcve(self): message = u'Привет, мир!' print message self.assertTrue(False, message.encode('utf-8')) Источник: https://stackoverflow.com/a/14181711/2790048 Когда пойму магию юникода в Python, дополню ответ.

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

#sql #sql_server #оптимизация


Есть выборка вида:

Id Value
1 5
2 5
3 6
4 3
5 5


Мне нужно сравнить значения Value из строк с Id равными N и N+1 (соседними строками).
Т.е. для простоты считаем, что Id - непрерывная последовательность натуральных чисел.

Вопросы:

1) Как это лучше, а главное, оптимальней сделать?

2) Всё то же самое, но мне нужно сравнить значения N подряд идущих строк... Как это
оптимальней сделать?
    


Ответы

Ответ 1



Ну тут, собственно, какие варианты могут быть. Если данные из соседних строк часто требуются, то думаю, оптимальнее всего будет выбрать и сохранить их в отдельный(-е) столбец(-цы), чтобы затем использовать. Если вычислять на лету - то либо windowed функции, либо join-ы на себя: select d.id, d.value, prev = lag(d.value) over (order by d.id) from data d select d.id, d.value, prev = d_lag.value from data d left join data d_lag on d_lag.id = d.id - 1 Если используются оконные функции, то для оптимальной производительности желательно придерживаться т.н. POC (Partitioning, Ordering, Coverage) индексации. Т.е. в данном случае должен быть кластерный индекс по Id, либо некластерный покрывающий index (Id) include (Value). При использовании join-ов эти индексы также пригодятся. Не совсем понятно, что значит "сравнить значения N подряд идущих строк". Вам нужно N предыдущих строк разложить по столбцам? select id, value, prev = lag(value) over (order by id), prev2 = lag(value, 2) over (order by id), prev3 = lag(value, 3) over (order by id), prev4 = lag(value, 4) over (order by id) from data select d.id, d.value, prev = d_lag.value, prev2 = d_lag2.value, prev3 = d_lag3.value, prev4 = d_lag4.value from data d left join data d_lag on d_lag.id = d.id - 1 left join data d_lag2 on d_lag2.id = d.id - 2 left join data d_lag3 on d_lag3.id = d.id - 3 left join data d_lag4 on d_lag4.id = d.id - 4 Или нужно скользящее среднее по N предыдущим строкам? select d.id, [ma20(-1)] = avg(d.value) over (order by d.id rows between 20 preceding and 1 preceding) [ma20(0)] = avg(d.value) over (order by d.id rows between 19 preceding and current row), from data d select d.id, [ma20(-1)] = [s-1].ma20, [ma20(0)] = s0.ma20 from data d cross apply ( select ma20 = avg(d2.value) from data d2 where d2.id between d.id - 19 and d.id ) s0 cross apply ( select ma20 = avg(d2.value) from data d2 where d2.id between d.id - 20 and d.id - 1 ) [s-1] Можете попробовать эти запросы на своих данных. На тестовых данных в 100 тыс. строк время исполнения запросов для двух методов (windowed и join) у меня получалось сравнимо, только последний запрос выигрывал по времени за счёт параллелелизма, но IO всюду в пользу windowed версий (в случае со скользящим средним - значительно). Вообще по IO все эти windowed запросы сравнимы с простым select id, value from data. Поскольку оконные функции экономнее по IO, подход с их использованием может быть предпочтительнее в случаях, когда IO является узким местом (например, в системах с большим количеством одновременно работающих пользователей). В иных случаях между join и windowed следует, вероятно, предпочесть то, что работает быстрее на конкретных данных.

Django. Как вывести тэги в шаблоне?

#python #django


Подключил django-taggit к блогу. Хочу вывести определенный набор тегов под каждой
статьей, используя {{ article.tags.names }}. В шаблоне - получаю список тэгов под статьей
['linux', 'python', 'english']. Как можно исправить это?

views.py:

def index(request):
 lastet_articles_list = Article.objects.order_by('-pub_date')
 list_of_tags = []
 for obj in lastet_articles_list:
    list_of_tags += obj.tags.names()
 list_of_tags = list(set(list_of_tags))
 context = {
    'lastet_articles_list': lastet_articles_list,
    'list_of_tags': list_of_tags,
 }
 return render(request, 'article/index.html', context)


(list_of_tags здесь использую, чтобы просто вывести имеющиеся тэги на сайте)

index.html:

{% if lastet_articles_list %} {% for article in lastet_articles_list %}
{{ article.title }}

{% endfor %} {% endif %}
models.py: from taggit.managers import TaggableManager class Article(models.Model): title = models.CharField(max_length=50) pub_date = models.DateTimeField('date published') text = models.TextField() tags = TaggableManager()


Ответы

Ответ 1



Все правильно, метод names возвращает массив имен тэгов. Выводите их по одному в вашем блоге. Эксперимент, чтобы понять как это работает: >>> from Tasks.models import Post >>> p = Post.objects.get(pk=1) >>> p.tags >>> p.tags.add('cat', 'dog') >>> p.save() >>> p.tags.names > >>> p.tags.names() ['cat', 'dog'] >>> for name in p.tags.names(): ... print(name) ... cat dog >>> p = Post() >>> p.title = 'Post 2' >>> p.text = 'second post' >>> p.save() >>> p.pk 2 >>> p.tags.add('cat') >>> p.save() >>> Post.objects.filter(tags__name__in=["cat"]) [, ] >>> Post.objects.filter(tags__name__in=["dog"]) []

css выбрать четные элементы по классу

#html #css


Суть задачи

Есть список

  • asd
  • asd
  • asd
.hidden {display: none;} Если применить li:not(.hidden):nth-child(2n) {background: red;} То он применит сначала :nth-child(2n), а потом проверит на наличие класса .hidden. Так вот задача в том чтобы :nth-child(2n) применился к коллекции li:not(.hidden). Как сделать через JS - понятное дело, добавить соответствующие классы для "видимых четных", как это сделать на CSS ?


Ответы

Ответ 1



как вариант .block > div { background: #ccc; margin: 10px 0; width: 100px; } .block > div:nth-of-type(2n) { background: red; } .hidden { display: none; }
asd
asd
asd
asd
asd
asd
asd


Передача значения из View в Model и последующий вызов метода - как?

#c_sharp #net #wpf #xaml #инспекция_кода


Следуя паттерну MVVM имеем View, ViewModel и некие классы для Model, в частности
ExcelImporter для импорта и парсинга экселевского файла.

Во вьюхе есть поле ввода адреса файла. Биндится к соответствующему свойству в VM:

public string ExcelPath
{
    get
    {
        return excelPath;
    }

    set
    {
        excelPath = value;
        OnPropertyChanged("ExcelPath"); //?
    }
}


Вопрос 1: если значение ExcelPath меняется только из вьюхи пользователем через диалоговое
окно выбора файла, то во ViewModel в сеттере ему ведь не нужно делать OnPropertyChanged("ExcelPath")?
И, следовательно, нужно в биндинге оставить Mode=Default (он же OneWay)?

Также в VM есть экземпляр класса ExcelImporter, который отвечает за импорт файла,
со свойством, опять же, ExcelPath.

Вопрос 2: где будет корректным передавать значение из VM.ExcelPath в ExcelImporter.ExcelPath?
В сеттере VM.ExcelPath? Или ещё была шальная мысль сделать событие ExcelPathChanged,
на которое подписать саму же VM, и в обработчике устанавливать ExcelImporter.ExcelPath
= ExcelPath. Или подписать на это событие ExcelImporter, но это по MVVM вроде как совсем
неправильно.

public string ExcelPath
{
    get
    {
        return excelPath;
    }

    set
    {
        excelPath = value;
        ExcelImporter.ExcelPath = ExcelPath; //?
    }
}


Вопрос 2.1: а можно вообще вот так сделать свойство в VM?

public string ExcelPath
{
    get
    {
        return ExcelImporter.ExcelPath;
    }

    set
    {
        ExcelImporter.ExcelPath = value;
    }
}


Вопрос 3: если в сеттере, то что именно присваивать: value, excelPath или, как в
вопросе 2, ExcelPath?

public string ExcelPath
{
    get
    {
        return excelPath;
    }

    set
    {
        excelPath = value;
        ExcelImporter.ExcelPath = value; //?
        ExcelImporter.ExcelPath = excelPath; //?
        ExcelImporter.ExcelPath = ExcelPath; //?
    }
}


Вопрос 4: чтобы ExcelImporter сразу же после получения ExcelPath выполнял метод Import()
- т.е. чтобы с точки зрения пользователя всё автоматически происходило после выбора
файла из обычного OpenFileDialog, без всяких лишних нажатий кнопки типа "Импортировать"
- этот метод должен вызываться где?
В сеттере VM.ExcelPath, в сеттере ExcelImporter.ExcelPath или через событие в ExcelImporter,
какой-нибудь ExcelPathChanged, на которое подписан... сам же ExcelImporter или VM,
и уже там в обработчике вызывать ExcelImporter.Import()?
Больше ничего в голову не приходит, а такое активное использование сеттера для кучи
дополнительных действий вызывает сомнение.

Вообще задача простая: получить из View адрес файла, передать его в ExcelImporter
и вызвать метод Import(). Может, вообще все вопросы неправильные, и это делается как-то
по-другому? И суть вопросов не в том как это сделать вообще, а как сделать правильно,
религиозно верно, так сказать, а не мартышкиным методом "абы работало" :)

PS
Прошу прощения за некоторое нарушение правил SO, за несколько вопросов сразу, но
как видите они взаимосвязаны, и создавать несколько отдельных тем показалось лишним.

UPD1

@andrey-k


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


Ну поле, оно же TextBox, существует постольку-поскольку, чтобы была возможность скопипастить
адрес файла, но в осноном конечно же выбор через винапишный OpenFileDialog. Хотя всё
это сводится к одному - по сути что ввод ручками пользователя, что OpenFileDialog возвращает
строкой путь к файлу. Разумеется, его нужно проверить. Но не вижу никакого смысла вынуждать
пользователя тыкаться лишний раз ещё в какие-то кнопки после указания файла. Выбор
документа и выуживание из него определённых данных - это первые 50% функционала.
    


Ответы

Ответ 1



По вопросу 1: View не должно знать, кто и как меняет свойства в VM. Завтра вы поменяете VM, и при этом вы не должны менять ещё и View. Пусть каждый из уровней заботится только о себе. По поводу OnPropertyChanged("ExcelPath"); //?: лучше писать, конечно, так: void NotifyPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } и пользоваться просто NotifyPropertyChanged(): string excelPath; public string ExcelPath { get { return excelPath; } set { if (excelPath != value) { excelPath = value; NotifyPropertyChanged(); } } } По поводу того, когда обновлять модель — это решать вам и только вам. Может быть, обновлять модель сразу неправильно, а нужно подождать, пока пользователь скомандует «вот сейчас давайте». А может быть, нужно обновлять её как можно скорее. Вы как архитектор вашего приложения должны решать такие вопросы сами. В любом случае, обновление модели — дело VM, а не наоборот. По вопросу 2.1 — технически так делать можно, да (но не забудьте NotifyPropertyChanged()). Вопрос в том, правильно ли это для вашего случая. Например, если модель бежит не в главном потоке, то доступ к ней из UI-потока может быть неверным. По вопросу 3 — не имеет ровно никакого значения. Все три значат одно и то же. (Я всё же не использовал бы ExcelPath, чтобы не идти лишний раз через getter, но это вопрос личных предпочтений.) По поводу вопроса 4 — опять-таки это не диктуется паттерном MVVM. Всё определяется лично вами. Я бы делал так: при выставлении setter'а проверял значение на правильность, проверял, можно ли запускать импорт, и при этом условии запускал бы: string excelPath; public string ExcelPath { get { return excelPath; } set { if (excelPath == value) return; excelPath = value; NotifyPropertyChanged(); OnPathChanged(); } } async void OnPathChanged() { if (!IsValidPath(excelPath)) { SetInvalidFlag(); // so UI can pick it up return; } await BookNewImport(); } ExcelImporter currentImporter, pendingImporter; async Task BookNewImport() { var importer = new ExcelImporter(ExcelPath); if (currentImporter != null) { pendingImporter = importer; await currentImporter.CancelAsync(); if (pendingImporter != importer) // new import booked return; // so not run ours } currentImporter = importer; await currentImporter.ImportAsync(); if (currentImporter == importer) currentImporter = null; // else there's other importer running } Это лучше тем, что модель дёргается только после всех проверок. Плюс, поскольку импорт — процесс по сути длительный, я бы сделал к нему async-интерфейс, и не блокировал вызывающий поток (как это сделано в сниппете выше).

Ответ 2



Не знаю как идеально, но могу сказать, как бы я сделал и почему. Я бы сделал так: private string _ExcelPath; public string ExcelPath { get { return _ExcelPath; } set { _ExcelPath = value; OnPropertyChanged("ExcelPath"); } } Делал свой пример не для диалога, а для поля, потому что прочитал Во вьюхе есть поле ввода адреса файла Сначала расскажу для случая с полем. То есть, когда пользователь вводит имя файла вручную. В своем примере предусмотрел развитие кода по следующем направлениям: Мне сложно было представить такую ситуацию, что импорт происходит сразу после ввода имени файла, минуя нажатие кнопки. Поэтому я на скорую руку сделал свою имплементацию ICommand. Во вью моделе определил эту команду, как свойство. Таким образом, вызов импортера не может произойти просто после ввода каких-то символов в поле, но происходит по вызову метода Execute() команды. При выполнении этого метода и считывается свойство ExcelPath. Сервис импорта не вызывается в сеттере в том числе и потому, что теоретически имя файла нужно бы сначала проверить, провести валидацию, а потом уже что-то с ним делать. Если подумать о пользовательском интерфейсе, то хорошо бы выводить адекватные сообщения об ошибках. В XAML, для поля ввода файла установлено UpdateSourceTrigger=PropertyChanged. После ввода каждого нового символа происходит обновления свойства вью модели, а так же изменяется состояние кнопки и индикатора. Если формат имени файла неверный, то кнопка серая и горит красный восклицательный знак. Красный восклицательный знак помимо серой кнопки введен для того случая, когда полей много, а кнопка одна, например, ОК. Тогда красный восклицательный знак показывает, какое именно поле косячное. Чтобы кнопка становилась серой, надо в сеттер добавить ImportExcelFileCommand.RaiseCanExecuteChanged(). Вдруг когда-нибудь станет нужным сброс этого поля изнутри вью-модели, поэтому в сеттере есть OnPropertyChanged("ExcelPath") и Mode=TwoWay. Теоретически, может быть и такая ошибка, которая не может быть обнаружена до нажатия кнопки. Напимер, существует ли файл. И так же нужно вывести адекватное сообщение. Если следивать принцмпам SOLID, то хорошо бы инъектировать сервис импорта в конструктор вью модели. И интуитивно мне кажется, что имя файла должно быть параметром функции: Import(fileName) Код: public partial class MainWindow : Window { private class ExcelImporter : IExcelImporter { public void Import(string excelFilePath) { MessageBox.Show(excelFilePath); } } public MainWindow() { DataContext = new ViewModel(new ExcelImporter()); InitializeComponent(); } } public class ViewModel: INotifyPropertyChanged { private readonly IExcelImporter _ExcelImporter; public MyQuickCommand ImportExcelFileCommand { get; private set; } //implements ICommand private string _ExcelPath; public string ExcelPath { get { return _ExcelPath; } set { _ExcelPath = value; OnPropertyChanged("ExcelPath"); ImportExcelFileCommand.RaiseCanExecuteChanged(); } } private bool _ExcelPathFormatIsValid; public bool ExcelPathFormatIsValid //if you want to indicate when the file format is incorrect { get { return _ExcelPathFormatIsValid; } set { _ExcelPathFormatIsValid = value; OnPropertyChanged("ExcelPathFormatIsValid"); } } public ViewModel(IExcelImporter excelImporter) { if (excelImporter == null) throw new ArgumentNullException("excelImporter"); _ExcelImporter = excelImporter; ImportExcelFileCommand = new MyQuickCommand(Import, IsExcelPathFormatValid); } private void Import() { if (!ExcelFileExists()) { //indicate error } else { try { _ExcelImporter.Import(_ExcelPath); } catch (Exception e) { throw e; } } } private bool IsExcelPathFormatValid() { bool validationResult; throw new NotImplementedException("ExcelPathIsValid"); ExcelPathFormatIsValid = validationResult; return validationResult; } private bool ExcelFileExists() { throw new NotImplementedException("FileExists"); } public event PropertyChangedEventHandler PropertyChanged = delegate { }; public void OnPropertyChanged(string propertyName) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } ICommand: public class MyQuickCommand : ICommand { private readonly Action _Execute; private readonly Func _CanExecute; public MyQuickCommand(Action executeAction) : this(executeAction, () => true) { } public MyQuickCommand(Action executeAction, Func canExecuteFunc) { if (executeAction == null) throw new ArgumentNullException("executeAction"); if (canExecuteFunc == null) canExecuteFunc = () => true; _Execute = executeAction; _CanExecute = canExecuteFunc; } public event EventHandler CanExecuteChanged = delegate { }; public bool CanExecute(object parameter) { if (parameter != null) throw new NotSupportedException("CanExecute MyCommand with parameter is not supported"); return _CanExecute(); } public void Execute(object parameter) { if (parameter != null) throw new NotSupportedException("Execute MyCommand with parameter is not supported"); _Execute(); } public void RaiseCanExecuteChanged() { CanExecuteChanged(this, EventArgs.Empty); } } public interface IExcelImporter { void Import(string excelFilePath); } XAML:

Как использовать перенос строки в левой части sed?

#linux #shell #sed


Отслеживаю логи через tailf (tail -f). Для удобства отображения хотелось бы после
каждой строки добавлять пустую строку.

Например: 

$ tailf /var/log/some.log
log1
log2
log3

$ tailf /var/log/some.log | magic
log1

log2

log3


Пробовал через sed двумя способами, но получаю то же без изменений. Идея в том, чтобы
поматчить перенос строки и заменить его на два переноса. Общий синтаксис такой: sed
's/substitute_this/to_this/g'

Способ 1: вставить перенос строки как $'\n'.

$ tailf /var/log/some.log | sed "s/$'\n'/test/g"
log1
log2
log3


Похоже, что $'\n' не матчится на переносы строк в моем логе.

Способ 2: вставить перенос строку как перенос строки при вводе команды:

$ tailf /var/log/some.log | sed "s/
> /test/g"
sed: -e expression #1, char 2: unterminated `s' command

$ tailf /var/log/some.log | sed "s/\
/test/g"
sed: -e expression #1, char 0: no previous regular expression


Если бы это был shell-скрипт, можно было бы использовать хак:

newline='
'


Но я-то хочу "на ходу" использовать. Сделать фукцию или alias тоже не подойдёт, т.к.
я работаю с большим количеством хостов и не имею возможности индивидуально настраивать
.bashrc.

Собственно, вопрос: что должно быть на месте magic?
    


Ответы

Ответ 1



Еще вариант с sed: tailf foo.log init.lxc 1455930731.917 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455930758.674 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986152.381 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986234.349 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy tailf foo.log | sed 'a\ ' init.lxc 1455930731.917 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455930758.674 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986152.381 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy init.lxc 1455986234.349 ERROR lxc_initutils - initutils.c:mount_fs:36 - failed to mount /proc : Device or resource busy

Ответ 2



вам надо в конце строки (а sed работает именно построчно) вставлять символ перевода строки \n. якорем (метасимволом, квантификатором), обозначающим конец строки, в большинстве диалектов регулярных выражений обычно служит символ $: $ tail -f /var/log/some.log | sed 's/$/\n/' для изоляции от «вмешательства» оболочки программу для sed лучше заключать в одинарные кавычки (да, s/$/\n/ — это именно программа, интерпретируемая программой sed).

Различные положения экранов для разных устройств

#java #android


Здравствуйте. Появилась проблема, заключающаяся в том, чтобы ограничить положение
изображения на экране. Если конкретно, то нужно, чтобы на tablet/phablet устройствах
приложение работало в landscape режиме, а на всех остальных - в portrait режиме. Как
это можно реализовать? Заранее благодарю за ответ.
    


Ответы

Ответ 1



В ресурсах для разных размеров экранов вы можете создать файл для хранения булевских переменных, и для смартфона хранить false, а для планшетов true. Далее в активити вызывать метод setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); проверяя перед этом значение и файле. Хороший пример здесь

Смена визуальных характеристик элементов готового синтаксиса в Sublime Text 3

#sublime_text #sublime_text_3


Не подсвечиваются/выделяются фоном нужные мне элементы кода. 



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


Ответы

Ответ 1



Если не устраивает ни одна готовая схема, задаём цвета самостоятельно. Стоит предупредить о трёх обстоятельствах: С момента внесения правки в цветовую схему до отображения нового цвета может пройти несколько минут. Иногда помогает перезагрузка файла или самого Sublime Text 3. Из stack trace и всплывающих окон редактора не всегда понятно, где совершил опечатку в синтаксисе. Рекомендую пользоваться плагином Local History, чтобы оставалась возможность откатиться до предыдущих версий файла. Scopes (см. ниже) меняются с выходом новых билдов Sublime Text 3. После обновления может оказаться, что прописанные вами настройки сбились, и придётся заново вставлять уже новые области видимости. Свойства, отвечающие за цвет и начертание элементов синтаксиса языков разметки, программирования, наборов макропакетов, языков и таблиц стилей и т. д. в Sublime Text 3 называются «scopes». Перевёл как «области видимости», за точность перевода не ручаюсь. Куда что вставлять Открываем файл своей активной цветовой темы (схемы). Если не знаете, как, см. здесь в первых двух абзацах после «Простое решение». Куда-нибудь между тегами нашей цветовой схемы вносим следующий XML-массив: name Scope Name scope scope(s) settings foreground color Параметры: — необязательный. Дабы не забыть, что означает вставленная нами область видимости. name, Scope Name — необязательный. Между тегами задаём любое имя области видимости, которое будет отображаться в TmTheme Editor. scope, scope(s) — между тегами вставляем область (или области) видимости. Как их получить — см. ниже по тексту. Важно не оставлять пространство между пустым, — иначе цветом, что указан у вас вместо color, подсветится и совсем не то, что вы хотели. foreground, color — между тегами указываем цвет в форматах HEX, ARGB или X11. Последний формат не рекомендовал бы ввиду того, что а) как минимум цвета aqua, fuchsia и lime не всегда поддерживаются Sublime Text 3, б) периодически возникают разного рода неисправности, не случающиеся, если вводим цвет в HEX или ARGB. Получаем и вносим область видимости одним из трёх способов, подробно расписанных ниже, вслед за примерами. Вписываем в XML-конструкцию цвет вместо color → сохраняем файл цветовой схемы → смотрим результаты. Примеры Золотой текст: scope text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly meta.property.object.js settings foreground gold Зелёный фон: scope text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly meta.function-call.method.without-arguments.js variable.function.js settings background #6BC7548F Наклонный коралловый текст: scope text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly meta.function-call.method.with-arguments.js variable.function.js settings fontStyle italic foreground lightcoral Ключи foreground, fontStyle (принимает значения bold или italic, значения указывать со строчной буквы) и background можно комбинировать между собой, т. е. допускается одновременное задание цвета элемента, его начертания и цвета фона вокруг: fontStyle italic foreground lightcoral Несколько областей видимости, которые будут иметь одинаковый цвет, вносятся через запятую. Допустим, мы желаем идентичную раскраску у открывающих и закрывающих скобок тега : name Tag script brackets, open and closed scope text.html.basic source.js.embedded.html punctuation.definition.tag.begin.html, text.html.basic source.js.embedded.html punctuation.definition.tag.end.html settings foreground yellow Результат, после того, как мы задали цвета областям видимости всем элементам примера. Было: Стало: Получение областей видимости: Узнать активную, т. е. до или в пределах которой находится каретка, область видимости элемента можно сочетанием клавиш Ctrl + Alt + Shift+ P. Scope отобразится в строке состояния (Status Bar) нижней части окна Sublime Text 3. Однако из строки состояния не скопировать необходимую область видимости, необходимо воспользоваться одним из трёх способов ниже. Плагины от adzenith и ttscoff, также предназначенные для получения scopes в буфер обмена, у меня не заработали, — по всей видимости, они для Sublime Text 2, но не Sublime Text 3. UPD: Начиная с билда 3114 области видимости отображаются уже в отдельном окне, а не строке состояния, и их можно копировать. Плагин от r-stein, о котором идёт речь ниже, уже не особо и нужен. 1. Плагин от r-stein Проделаем следующие операции: а. Копируем в буфер обмена следующий код: sublime.set_clipboard(view.scope_name(view.sel()[0].b)) б. Устанавливаем каретку (упрощённо говоря, кликаем левой кнопкой мыши) до или внутри — но не после — элемента синтаксиса, цвет которого хотим изменить. в. Ctrl + ` (машинописный обратный апостроф, символ расположен на той же клавише, где кириллическая «ё») → вставляем в открывшееся поле ввода код, что мы скопировали на 1-м этапе, → Enter → в нашем буфере обмена содержится необходимая область видимости. Как можно убедиться на практике, это не очень удобно. Для упрощения выполнения операции служит плагин от ув-мого r-stein. Tools → New plugin... → Вставляем в открывшийся файл код на Python: import sublime, sublime_plugin class CopyScopeCommand(sublime_plugin.TextCommand): def run(self, edit): view = self.view sublime.set_clipboard(view.scope_name(view.sel()[0].b)) sublime.status_message("Scope copied") Ctrl + S → сохраняем файл как copy_scope.py. Задаём плагину шорткат: Preferences → Paskage Settings → Mediawiker → Key Bindings - User → между [] вписываем в открывшийся файл: // Копирование областей видимости { "keys": ["ctrl+7", "ctrl+o"], "command": "copy_scope" }, Сохраняем. Чтобы сочетание наверняка оказалось ничем не занятым, я выбираю двухэтапные хоткеи — то есть ввожу Ctrl + 7, затем Ctrl + O, и только после двух нажатий выполняется необходимая команда. Можете назначить одноэтапный, только лучше удостоверьтесь, что шорткат свободен: Preferences → Key Bindings - Default → в открывшемся файле Ctrl+F → временно отключаем кнопку Regular expression, иначе не удастся найти символ +, → вводим в форму поиска сочетание клавиш, которое хотим использовать, → если оно задействовано, выбираем другое, которое, впрочем, также может быть занято каким-то из установленных вами плагинов. (опционально) Добавляем кнопку вызова плагина в контекстное меню, появляющееся при нажатии правой кнопкой мыши в любую область ввода текста: Preferences → Browse Packages... → User → создаём файл Context.sublime-menu, если его нет, → вставляем в файл [ { "command": "copy_scope" }, ] Сохраняем. Если же файл существует, и в нём прописана команда для другого плагина, разделяем объекты запятыми после {фигурных скобок}. Объекты заключены в [квадратные скобки] (JSON-синтаксис). [ { "command": "lat_to_cyr" }, { "command": "copy_scope" }, ] То же замечание по поводу запятых и скобок касается предыдущего и последующего примеров. (опционально) Добавляем кнопку вызова плагина в верхнее меню: Preferences → Browse Packages... → User → создаём файл Main.sublime-menu, если его нет, → вписываем: [ { "id": "edit", "children": [ { "command": "copy_scope" } ] }, ] Сохраняем. Наводим каретку до или внутри элемента, область видимости которого следует узнать, → вызываем команду получения scope любым из методов — Ctrl + 7, затем Ctrl + O; клик правой кнопкой мыши в любую область ввода текста → Copy Scope; Edit → Copy Scope — область видимости находится в нашем буфере обмена. 2. ScopeHunter онлайн Сервис поддерживает только синтаксисы, перечисленные на картинке ниже, тогда как методами 1 и 3 изменяется раскраска у любых элементов всех синтаксисов Sublime Text 3. Например, я написал цветовую схему с поддержкой вики-разметки, для меня вариант со ScopeHunter онлайн частично не подошёл. Переходим на сайт TmTheme Editor → Gallery, если пользуетесь готовой цветовой схемой, Open — собственной (когда файл темы находится среди файлов вашего компьютера, открываете его, как описано здесь, и в title окна Sublime Text 3 высветится путь к локальному файлу) → в правом нижнем углу выбираем необходимый язык разметки/программирования → Customize Preview Code → вставляем тот самый код, где элементы подсвечиваются не так, как вам нужно → Save → Scope Hunter → наводим мышью на элементы → под строкой Current Scope выводится искомая область видимости: Если у выбранной области видимости задан параметр «Name» (под «Matching Rule»), то слева находим Score Name c таким же значением параметра, как у «Name», → меняем цвета в веб-панели. Доступен онлайн-предпросмотр. Когда же напротив Name ничего не указано, придётся создавать XML-массив (см. Куда что вставлять) и вписывать область видимости в него. Save → Download → сохраняем файл туда же, откуда его взяли. К сожалению, работа над сервисом фактически прекращена, результат будет отличаться от того, что вы имеете в Sublime Text 3, иногда разительно. Скриншоты одного скрипта, сделанные 13 июня 2016 в Sublime Text 3 и TmTheme Editor: 3. Плагин ScopeHunter Поддерживаются любые синтаксисы. Устанавливаем плагин через Package Control → Ctrl + Shift + P → в появившееся поле ввода вписываем одну из двух команд: Scope Hunter: Toggle Instant Scoper — (зная о fuzzy поиске, можно ввести shtis) решение, когда необходимо изменить цвета множеству элементов. Внизу появится консоль, где отобразятся области видимости, автоматически сменяющиеся в зависимости от того, до или внутри какого элемента синтаксиса располагается каретка. Чтобы scopes добавлялись в буфер обмена автоматически, задайте значение true параметру clipboard: Preferences → Package Settings → ScopeHunter → Settings - User → вставляем следующий код и сохраняем файл. { "clipboard": true, } Когда вы не собираетесь работать с областями видимости, чтобы они не мешались в буфере обмена, установите значение false или же прекратите действие команды ScopeHunter перезагрузкой Sublime Text 3. Впрочем, иногда она сама по непонятным причинам прекращает функционировать, и приходится заново после Ctrl+Shift+P вводить shtis. Scope Hunter: Show Scope Under Cursor — подходит, когда требуется преобразить колор одному или нескольким элементам. После того, как вы закрываете консоль клавишей Esc, чтобы узнать области видимости ещё раз, придётся вновь набирать данную команду. Если в течение сеанса работы в Sublime Text 3 вы ввели одну из этих команд, то другая не заработает до того, как вы перезагрузите Sublime Text 3. Поддерживаются множественные курсоры. Зажмите клавишу Ctrl и кликайте мышью до или внутри элементов, область видимости которых необходимо узнать. В нижней консоли появятся scopes сразу всех их. Пример: Scope: text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.brace.round.js ------ Scope: text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly variable.other.readwrite.js ------ Scope: text.html.basic source.js.embedded.html source.js meta.group.braces.round meta.group.braces.curly support.type.object.dom.js ------ Копируем области видимости (то, что справа, без Scope: с чёрточками). Резюме по рассмотренным способам получения областей видимости: Плагин от r-stein: Плюс — наиболее быстрое получение scopes, Минус — нет никаких дополнительных функций. ScopeHunter онлайн: Плюс — быстрый предпросмотр цветов онлайн, Минусы — неактивный разработчик и как следствие отсутствие поддержки новых изменений; ограниченная поддержка синтаксисов. Плагин ScopeHunter: Плюс — работа сразу с множеством областей видимости, Минус — перебои в работе плагина. Когда мне требуется изменить 1—2 области видимости, я пользуюсь плагином от r-stein; нужен быстрый предпросмотр — захожу в TmThemeEditor; ну а если основательно сажусь править цветовых темы, то привожу в действие плагин ScopeHunter.

Выбор цветов для “ночной” темы

#android #gui #ui #color #material_design


Пишу погодное приложение. 

Для подбора цветов, чтобы следовать концепции Material Design, использовал ресурс
https://www.materialpalette.com/. 

Остановился на следующей цветовой схеме (см. рисунок ниже)

Сейчас решил добавить "ночную тему" (см рисунок ЕЩЕ ниже :-)

Я брал цвета "на глаз". 

Существуют какие-либо гайды или ресурсы для подбора цветов для ночных тем? Как правильно
подобрать цвета для ночной темы, следуя концепции Material Design?

Заранее спасибо




    


Ответы

Ответ 1



Нашел любопытную статейку по первому вопросу. Находим картинку в спокойных темных тонах Загружаем в pictaculous Profit

Ubuntu 16.04 LTS не переходит в ждущий режим

#ubuntu


После обновления до Ubuntu 16.04 LTS мой ноутбук перестал переходит в ждущий режим.
Просто гаснет экран, но ноутбук продолжает работать, на какие либо действия со стороны
пользователя перестает отвечать. Из такого состояния его никак не вывести, только с
помощью перезагрузки 
через кнопку питания.

Ноутбук hp pavilion dv6 6169er. В Ubuntu 15.10 все работало нормально. 

После установки сделал очистку системы от неиспользуемых пакетов и удалил старые
ядра. Возможно после этих действий, я случайно удалил библиотеку, отвечающую за корректный
переход в "ждущий режим", Но это только предположение, все делалось через стандартный
менеджер пакетов. 
    


Ответы

Ответ 1



Как я понял, это нормальная практика пока. У меня аналогичная ситуация. Вот, что пишут в сети по этому поводу: http://www.omgubuntu.co.uk/2016/03/ubuntu-drops-amd-catalyst-fglrx-driver-16-04 Ещё можешь попробовать поставить новое ядро, вот, что нарыл я по этому поводу: http://lifepluslinux.blogspot.ru/2016/04/ubuntu-1604-wont-wake-up-from-suspend.html Мне, кстати, это помого. =)

Доступ к serial port из nativescript

#android #nodejs #serial #nativescript


Как можно работать на android с usb serial port из nativescript в anroid?
Я не имею представления как работают с ним на java и не могу найти нечего подобного
в api.
Я читал что обычные npm модули не будут работать на nativescript , как тогда вообще
можно докопаться до serial port?
Возможно как то через файловую систему можно долезть до serial port?
    


Ответы

Ответ 1



К сожалению похоже что нету вариантов доступа к serial port из nativescript. Из подобных кросс платформенных библиотек, получить доступ получилось в phonegap, через плагин cordovarduino всё работает, не скажу что идеально, но работает, в отличии от nativescript в котором как оказалось нету доступа к serial port.

Ответ 2



Сам пока не пробовал, но возможно https://code.google.com/archive/p/android-serialport-api/ сможет предоставить доступ к последовательному порту. На сколько я понимаю, суть в том, что девайс будет находиться системой как файл.

Как узнать размер L3 кэша AMD/Intel

#cpp #c #ассемблер


Как можно узнать размер кэша L3 на различных процессорах, используя серию вызовов
__cpuid(ex)? 

void __cpuidex(int *regs, int leaf, int attempt)
{
    __asm
    {
        mov ecx, attempt
        mov eax, leaf
        cpuid
        mov esi, regs
        mov [esi], eax
        mov [esi + 4], ebx
        mov [esi + 8], ecx
        mov [esi + 12], edx
    }
}

    


Ответы

Ответ 1



Могу предложить альтернативный вариант получения L3Cache из SMBIOS (без вызова __cpuid(ex) ): Получить структуру ProcessorInformation, в ней есть поле L3CacheHandle, по которому из структуры CacheInformation можно получить размер кеша. Спецификация SMBIOS

Ответ 2



Почему бы не почитать спецификацию? Запрос на "amd cpuid specification" даёт ссылку http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/25481.pdf Зачем читаем L3: CPUID Fn8000_0006_EDX L3 Cache Identifiers bits from:to 31:18 L3Size: L3 cache size. Specifies the L3 cache size is within the following range: (L3Size[31:18] * 512KB) L3 cache size < ((L3Size[31:18]+1) * 512KB). 17:16 reserved 15:12 L3Assoc: L3 cache associativity. L3 cache associativity. See Table 4. 11:8 L3LinesPerTag: L3 cache lines per tag. 7:0 L3LineSize: L3 cache line size in bytes. table4 0h L2/L3 cache or TLB is disabled. 1h Direct mapped. 2h 2-way associative. 4h 4-way associative. 6h 8-way associative. 8h 16-way associative. Ah 32-way associative. Bh 48-way associative. Ch 64-way associative. Dh 96-way associative. Eh 128-way associative. Fh Fully associative По идее что-то такое function getL3Size(){ int regs[4]; __cpuidex(®s,0x8000,6); return (((unsigned long)regs[0]) >> 18) * 512 * 1024; }

Локализация WPF-приложения

#c_sharp #wpf #xaml #локализация


Подскажите, пожалуйста, как выполнить локализацию WPF-приложения?

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


Ответы

Ответ 1



Нормальная локализация в C# представлена одним единственным способом - resx файлы. Для небольших проектов можно просто включить ресурсы, открываем свойства проекта и пользуемся: В проекте при этом создается resx файл с локализацией по умолчанию. Чтобы добавить ещё одну - достаточно создать (Add -> New Item -> resx) ещё один файл, дополнив имя культурой (Resources.{culture}.resx) В коде просто пишем обращение к ресурсу: Console.WriteLine(Resources.Example); Для смены языка приложения принудительно достаточно поменять CurrentUICulture. Теперь по поводу дополнительных сборок. Хороших решений тут нет, простота выше описанного решения теряется, как только вы пытаетесь сделать шаг влево\вправо. Более менее рабочее решение описано тут (enSO), но оно жутко неудобное в использовании. Как можно заметить, простота использования вида Console.WriteLine(Resources.Example); теряется и обращения происходят уже вручную. Это можно автоматизировать, но тогда уже лучше вместо стандартного генератора посмотреть в сторону шаблонов (для общего представления можно глянуть MSDN). Т.е. чтобы сделать всё в одной сборке вам придётся написать замену стандартной схеме сборки ресурсов. Стоит ли оно того - решайте сами. Если интересны варианты с шаблонами - лучше изучите вопрос и задавайте вопросы отдельно, готовое решение так не видел, самописные в разных организациях - попадались. В дополнение, как совет по поводу: Планируется, что программа будет передаваться между коллегами и не хочется создавать зависимостей. Есть click-once, хоть он и очень неудачный на мой взгляд. Но, никаких заморочек по зависимостям и куче сборок не будет.

Русские буквы в имени файла. TZipFile

#delphi #archive #delphi_xe8


Хочу разархивировать файл(*.zip). В нем содержатся файлы имена которых на русском.
Вот такая конструкция

procedure TWorkThread.ExctractZip(aArchFile: string; aPath: string);
var
  zZip: TZipFile;
begin
  zZip := TZipFile.Create;
  try
    zZip.ExtractZipFile(aArchFile, aPath);
  finally
    FreeAndNil(zZip);
  end;
end;


В итоге после разархивации имена этих файлов превращаются в кракозябру Çéè«¡Γα«½∞
αÑßΓ«αá¡δ.pdf

Как это побороть?
    


Ответы

Ответ 1



К сожалению, формат ZIP не слишком строго стандартизирован (к примеру, Unicode был официально стандартизирован в только в 2007 году - в спецификации PKWARE 6.3.2). Проблема даже не только в стандарте, сколько в бесчисленном количестве программ, которые сохраняют имена как им вздумается - что, в общем-то, не удивительно при такой спецификации. В частности, существует несколько вариантов хранения имён файлов с символами, выходящими за рамки ASCII: ANSI OEM CP437 (DOS Latin US) UTF-8 UTF-8 с флагом Дополнительное (extra) поле $7075 - стандарт PKWARE/Info-ZIP Дополнительное (extra) поле - я забыл числовой код, от другой программы Ужасная мешанина. Что хуже всего - часто нет никакого способа определить метод хранения имён, кроме ручного указания человеком (первые четыре способа из списка выше программно неразличимы). Поиграйтесь с флагом UTF8Support: если поможет - хорошо, если нет - надо или искать другой распаковщик, или другой упаковщик.

Ответ 2



Нужно изменить стандартный модуль zip.pas. Проверено на Delphi 10.2. function TZipFile.TBytesToString(B: TBytes): string; var E: TEncoding; begin if CyrillicSupport then //условие, нужна ли поддержка кириллицы, можно убрать E := TEncoding.GetEncoding(866) else if FUTF8Support then E := TEncoding.GetEncoding(65001) else E := TEncoding.GetEncoding(437); try Result := E.GetString(B); finally E.Free; end; end; function TZipFile.StringToTBytes(S: string): TBytes; var E: TEncoding; begin if CyrillicSupport then //условие, нужна ли поддержка кириллицы, можно убрать E := TEncoding.GetEncoding(866) else if FUTF8Support then E := TEncoding.GetEncoding(65001) else E := TEncoding.GetEncoding(437); try Result := E.GetBytes(S); finally E.Free; end; end;

Ответ 3



Я не специалист по дельфи, но вы можете попробовать стандартные decode-encode с разными кодировками. Составляете заранее словарик из русских букв и в каждой попытке определить кодировку побуквенно прогоняете полученное название через словарик. Как только нашли совпадение - вуаля. Это если проблемы с названием. Также, например, в питоне есть библиотека chardet, которая определяет кодировку самого файла, а не его названия.

На чем создавать gui для Linux на c#?

#c_sharp #gui #gtk


Есть задача написать графическую программу под Linux. До этого писал только на WinForms.
Читал что под линукс для c# используют gtk#. Но на вики пишется что у gtk# частичная
поддержка до 2.20, хотя уже сейчас уже вышла версия gtk 3.20. Есть ли какие-то другие
решение для линукса или и с gtk# как-то работать можно?
    


Ответы

Ответ 1



GtkSharp уже портирован под GTK3. Релиз 3.0 ещё не объявлен, но в репозиториях некоторых дистрибутивов уже есть. А почему обязательно C#? Не хотите присмотреться к Vala? Клон C#, сделанный на базе библиотек GNOME с хорошей интеграцией в экосистему.

Ответ 2



Есть еще подобие Qt для c# - https://github.com/ddobrev/QtSharp. Проект вроде еще немного развивается(последний коммит был на прошлой неделе). Но у меня с этой библиотекой как-то не сошлось.

диагностика с помощью telnet

#сеть #tcp #faq #telnet


как при помощи программы telnet проверить, доступен ли указанный tcp-порт на указанной
машине, и слушает ли этот порт какая-нибудь программа?



приветствуются канонические ответы с примерами для разных операционных систем и реализаций
программы telnet.
    


Ответы

Ответ 1



unix-подобные операционные системы вероятно, чаще всего здесь можно встретить bsd- и gnu-реализации: netkit-telnet и inetutils-telnet. для указанной диагностики разница между ними несущественна. пример неудачного подключения к порту 12345 на каком-нибудь из серверов, в ip-адрес которого резолвится имя github.com: $ telnet github.com 12345 Trying 192.30.253.113... прервать неудачную попытку можно с помощью ctrl+c пример удачного подключения к тому же серверу на порт 22: $ telnet 192.30.253.113 22 Trying 192.30.253.113... Connected to 192.30.253.113. Escape character is '^]'. SSH-2.0-libssh-0.7.0 последняя строчка здесь — это уже информация от программы, слушающей 22 порт на опрашиваемом сервере. если соединение сразу же не было разорвано слушающей программой (это зависит от её реализации и настроек), то прервать telnet-сессию можно, нажав предложенную программой комбинацию ctrl+], а затем клавишу enter, после чего появится приглашение программы telnet: telnet> в котором можно ввести команду q (или полностью — quit) и нажать клавишу enter. Microsoft Windows Действия практически идентичны варианту для unix-подобных ОС. В Windows имеется встроенный telnet-клиент, но он может быть отключен. Чтобы его включить нужно выполнить шаги, описанные на сайте Microsoft. Когда всё готово, запустить telnet-клиент можно так: Пуск - Выполнить - telnet - ОК В открывшемся консольном окне будут видны следующие строки: Welcome to Microsoft Telnet Client Escape Character is 'CTRL+]' Microsoft Telnet> Чтобы попытаться открыть тот или иной адрес и порт нужно написать букву o, а затем адрес и порт. Например: Microsoft Telnet> o github.com 12345

Слияние веток, в одной из которых файлы были не переименованы, а удалены и созданы в другом каталоге

#git #git_merge




В последнем коммите ветки hometype есть изменения, которые должны быть в ветке master,
но влить ее в мастер не получается, потому что в коммите Rename были изменены названия
пакетов, что в общем означает новое местоположение файла/класса.

Получается, что в ветке master файлы, для которых есть изменения в hometype, находятся
в других местах.

Как их теперь объединить, если это вообще возможно?
    


Ответы

Ответ 1



судя по всему, git «не знает» о произведённых (в ветке master) переименованиях, и не может «связать» изменения, произведённые в другой (hometype) ветке (со «старыми» файлами), с файлами «новыми». один из возможных (но не самый «изящный» из) путей «влить» изменения из другой ветки (hometype) в основную — получить патч из изменений, внесённых в ветке hometype, вручную исправить в нём имена файлов, и «наложить» патч в основной ветке командой git apply файл.с.патчем (см. man git-apply). совет: тренироваться лучше на тестовой ветке, создав её командой git checkout -b тестовая-ветка исходная-ветка. изменять надо будет такие примерно строки: diff --git a/file1 b/file1 index 88621c5..af3bc11 100644 --- a/file1 +++ b/file1 здесь имя файла, которое надо будет вручную исправить — file1, оно встречается четыре раза, и все четыре его появления надо исправить. будьте внимательны: так как у вас были исправления, судя по всему, нескольких файлов, то блоков таких будет больше одного. получить патч из изменений, внесённых commit-ом, зная его хэш, можно, например, так: $ git diff хэш^ хэш запись хэш^ означает в данном случае «родительский» (parent) commit для данного commit-а. см. man git-diff на предмет подробностей об этой команде и man gitrevisions о смысле ^ и подобных модификаторов. в будущем я бы порекомендовал переименования файлов/каталогов делать отдельным коммитом (отдельным от изменения содержимого этих же файлов). тогда программа git без дополнительных указаний должна распознавать такие переименования. другой путь решения озвученной в вопросе проблемы (он более «изящен», но требует довольно длинного описания) как раз и основывается на указании программе git, какую долю изменений в файле, «удалённом в одном месте и созданном в другом», следует считать переименованием. для команды merge это делается с помощью опции rename-threshold стратегии recursive. см. описание этой опции в man git-merge и опции -M в man git-diff.

Postgres ограничить время запроса в SQL

#postgresql


если я напишу 

set statement_timeout to 1000; select * from bigtable 


то это ограничит время действия только этого скрипта? или моей сессии? или глобально
для всего сервера?
    


Ответы

Ответ 1



документация If SET (or equivalently SET SESSION) is issued within a transaction that is later aborted, the effects of the SET command disappear when the transaction is rolled back. Once the surrounding transaction is committed, the effects will persist until the end of the session, unless overridden by another SET. Т.е. это изменение настройки на сессию. Если set был вызван внутри транзакции и транзакция была отменена, то значение настройки откатится на предыдущее. При коммите транзакции или вызове вне транзакции - будет продолжать действовать на текущую сессию и настройка может быть изменена другим set'ом.

Как оптимизировать sql запрос (выборка из 1.5M строк)?

#sql #postgresql #оптимизация


Выбираю данные между двумя датами с количеством строк более миллиона таким запросом:

SELECT
  time AT TIME ZONE 'UTC' AT TIME ZONE 'MSK' AS time,
  type,
  CASE
    WHEN (duration > (extract(epoch from (time - '2015-08-29 12:36:50'))) )
    THEN extract(epoch from (time - '2015-08-29 12:36:50'))
    ELSE duration
  END AS trim_duration
FROM clamps
WHERE device_id = 27 AND time BETWEEN '2015-08-29 12:36:50' AND '2016-03-15 12:36:50'
ORDER BY time ASC


Структура таблицы:

CREATE TABLE clamps
(
  id serial NOT NULL,
  "time" timestamp without time zone,
  duration numeric,
  type character varying(255),
  device_id integer,
  packet_id integer,
  dur_float double precision DEFAULT 0,
  created_at timestamp without time zone DEFAULT now(),
  updated_at timestamp without time zone DEFAULT now(),
  CONSTRAINT clamps_pkey PRIMARY KEY (id)
)


Имеется индекс:

CREATE UNIQUE INDEX index_clamps_on_device_id_time
ON clamps
USING btree (device_id, "time");


Explaine Analyze:

Sort  (cost=149213.28..150770.01 rows=622695 width=21) (actual     time=4263.385..4713.566
rows=1469514 loops=1)
  Sort Key: "time"
  Sort Method: external merge  Disk: 71816kB
  ->  Bitmap Heap Scan on clamps  (cost=17535.79..89284.59 rows=622695 width=21)
(actual time=190.593..2692.161 rows=1469514 loops=1)
    Recheck Cond: ((device_id = 27) AND ("time" >= '2015-08-29 12:36:50'::timestamp
without time zone) AND ("time" <= '2016-03-15 12:36:50'::timestamp without time zone))
    Heap Blocks: exact=17528
    ->  Bitmap Index Scan on index_clamps_on_device_id_time  (cost=0.00..17380.12
rows=622695 width=0) (actual time=186.667..186.667 rows=1469514 loops=1)
          Index Cond: ((device_id = 27) AND ("time" >= '2015-08-29 12:36:50'::timestamp
without time zone) AND ("time" <= '2016-03-15 12:36:50'::timestamp without time zone))
Planning time: 0.291 ms
Execution time: 5414.691 ms


Запрос выполняется секунд 9-13 (хоть explain и показывает 5.5). Можно как-то запрос
оптимизировать?
    


Ответы

Ответ 1



Есть ощущение, что потенциальная проблема у вас в условии WHERE с неявным преобразованием типов данных: time BETWEEN '2015-08-29 12:36:50' AND '2016-03-15 12:36:50', попробуйте переписать с CAST и добавить индекс на time (кстати, называть поля базы данных зарезервированными словами - плохая практика), такая же проблема возможно присутствует и в extract(epoch from (time - '2015-08-29 12:36:50'))

Ответ 2



Разберем вывод Explaine Analyze Индекс задействуется, причем, индекс очень хорош, ибо задействует все поля выборки и реальное сканирование индекса составляет всего 186.667 ms. Тут оптимизировать нечего. Выборка по индексу занимает от 190.593 до 2692.161 ms. Можно ли что-то с этим сделать? Если версия базы >= 9.2, то можно построить индекс, который бы задействовал не только поля выборки, но и поля вывода, тогда вся выборка будет делаться исключительно по индексу и к таблице обращения вообще не будет, т.е. этот пункт будет отсутствовать. Если база постарее, то увы, only index scan появился лишь в 9.2. Соответсвенно, новый индекс: CREATE INDEX index_clamps_on_device_id_time_type_duration ON clamps USING btree (device_id, "time", type, duration); Сортировка однопроходная, выполняется от 4263.385 до 4713.566 ms. Вот он, "добрый" кусок потери времени. К сожалению, единственное, что с этим можно сделать - отказаться от сортировки. Задумайтесь, так ли она нужна? Несостыковка времени выполнения запроса с реально наблюдаемым. Напрашивается вопрос, а как производился замер реально наблюдаемого времени выполнения? Не уж-то от момента запуска запроса до появления данных в клиенте? Ну так извините, как на доставку 1.5 млн строк данных до клиента, так и на отображение их непостредственно в клиенте тоже время требуется. Время выполнения первого пункта можно сократить лишь уменьшением передаваемых данных (ничего лишнего не тащить) либо увеличением пропускной способности канала между клиентом и сервером. Второй - сменой клиента на более шустрый аналог. Если же выборка делается в коде своей программы/скрипта, то сменить подход к получению данных с сервера, не ждать получения всех данных, а забирать небольшими порциями, тогда их в параллельном потоке можно будет уже начать обрабатывать не дожидаясь получения всех данных. Еще одна причина несостыковки возможна при обращении к таблице с большим количеством наследованных таблиц. Но думается, не тот случай, при столь подробно составленном вопросе, врядли бы об этом умолчалось, так что эту тему не затрагиваю.

Межкомпонентная связь React: как передавать данные между компонентами?

#javascript #reactjs #meteor


Здравствуйте! Вопрос касается связи между компонентами React,а именно: передача данных
из одного компонента в другой.

Пусть есть страница , у которой есть массив объектов items. Для каждого
элемента items создается компонент :

Код Layout.jsx:

class Layout extends Component {
  renderItems() {
    var items = [
      {name: 'Ivan', _id: '1'},
      {name: 'Petya', _id: '2'}
    ];

    return items.map( (each) => {
      return (
        
      );
    });
  }

  render() {
    return (
      
{this.renderItems}
); } } Код Item.jsx: class Item extends Component { render() { return (
{this.props.each.name}
); } } Пусть теперь я хочу реализовать по щелчку на каждый вывод в консоль его _id. Сделать это внутри самого не составляет никакого труда: Новый код Item.jsx: class Item extends Component { printId() { console.log(this.props.each._id); } render() { return (
{this.props.each.name}
); } } Но как быть, если нужно реализовать кнопку "Показать _id" снаружи, то есть в ? Допустим, внутри каждого добавим checkbox. Если этот чекбокс отмечен галочкой как selected, то при нажатии кнопки 'Показать _id' в консоль выводятся _id всех отмеченных Itemов. Но как передать _id отмеченных Itemов в ? Заранее благодарен за ответы.


Ответы

Ответ 1



Ответ нашелся сразу в документации, спасибо @AlexeyTen за наводку. Пришлось помучиться, однако решение готов и оно ниже. При вызове функции из компонента someFunction.bind(this) мы можем передавать любое количество аргументов: someFunction.bind(this, arg1, arg2, ...). В этом и заключается ответ. Для примера выше: добавим функцию printId в компонент и навесим на компонент вызов printId по событию onClick. В качестве аргумента в функцию будем передавать текущий _id элемента. Новый код Layout.jsx: class Layout extends Component { printId(id) console.log(id); renderItems() { var items = [ {name: 'Ivan', _id: '1'}, {name: 'Petya', _id: '2'} ]; return items.map( (each) => { const eachId = each._id; return ( ); }); } render() { return (
{this.renderItems}
); } } Однако, код выше не будет работать. Причина в том, что это не настоящий DOM-элемент, соответственно и события OnClick у него быть не может. В строке onCLick является обычным props. Для того, чтобы этот код работал, как ожидается, нужно внутри компонента у настоящего DOM-элемента прописать передачу настоящему onClick нашу функцию из props: class Item extends Component { render() { return (
{this.props.each.name}
); } } Теперь все работает как надо.

Баг при использовании CSS-свойства transform

#css #transform


При использовании CSS-свойства transfrom наблюдается пробел между HTML-элементами.

Что это вообще за пробел и как его можно красиво убрать?

Фигура тут не имеет значение. Важно именно решение проблемы без JS Canvas.

http://jsfiddle.net/g2w6y7fm/1



.top-left {
  position: absolute;
  width: 140px;
  height: 120px;
  top: 45px;
  left: 50px;
  background-color: red;
  transform-origin: top right;
  transform: rotate(-30deg);
}
.right {
  position: absolute;
  left: 100%;
  top: 0;
  width: 0;
  height: 0;
  border-top: 120px solid red;
  border-right: 70px solid transparent;
}
.left {
  position: absolute;
  right: 100%;
  top: 0;
  width: 0;
  height: 0;
  border-top: 120px solid red;
  border-left: 70px solid transparent;
}


Ответы

Ответ 1



К .top-left добавляем backface-visibility: hidden. .top-left { backface-visibility: hidden; position: absolute; width: 140px; height: 120px; top: 45px; left: 50px; background-color: red; transform-origin: top right; transform: rotate(-30deg); } .right { position: absolute; left: 100%; top: 0; width: 0; height: 0; border-top: 120px solid red; border-right: 70px solid transparent; } .left { position: absolute; right: 100%; top: 0; width: 0; height: 0; border-top: 120px solid red; border-left: 70px solid transparent; }
http://jsfiddle.net/yw066stw/

Ответ 2



2 вариант - добавить translate3d( 0, 0, 1px); .top-left { position: absolute; width: 140px; height: 120px; top: 45px; left: 50px; background-color: red; transform-origin: top right; transform: rotate(-30deg) translate3d( 0, 0, 1px); } .right { position: absolute; left: 100%; top: 0; width: 0; height: 0; border-top: 120px solid red; border-right: 70px solid transparent; } .left { position: absolute; right: 100%; top: 0; width: 0; height: 0; border-top: 120px solid red; border-left: 70px solid transparent; }


Автостарт сервиса после полного старта mongodb

#linux #ubuntu #mongodb #systemd


Система: ubuntu 16.04.1 (для запуска сервисов используется systemd).

Имеем: приложение-сервис, которое зависит от mongodb. Приложение и mongodb запускаются
автоматически, на старте ubuntu. В .service файле приложения прописана зависимость:

After=network.target mongod.service


При этом, вероятно, из-за того, что mongodb сразу после старта ещё не готова принимать
подключения, приложение падает с ошибкой "невозможно подключиться к бд".

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


Ответы

Ответ 1



В этом случае воспользуйтесь ExecStartPost и netcat: ExecStart= ExecStartPost=/bin/sleep 1s ExecStartPost=/usr/bin/nc -z host port Где host port - адрес и порт mongodb. systemd будет ожидать выполнения всех команд до запуска зависимых сервисов. В случае если время старта может "плавать" поможет: until [[ $(nc -z ) -eq 1 ]]; do sleep 1s; done until будет вызывать sleep до тех пор пока netcat возвращает -1. ExecStartPre и ExecStartPost часть жизненного цикла запуска unita ExecStartPre=, ExecStartPost= Additional commands that are executed before or after the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially. If any of those commands (not prefixed with "-") fail, the rest are not executed and the unit is considered failed. ExecStart= commands are only run after all ExecStartPre= commands that were not prefixed with a "-" exit successfully. ExecStartPost= commands are only run after the service has started successfully, as determined by Type= (i.e. the process has been started for Type=simple or Type=idle, the process exits successfully for Type=oneshot, the initial process exits successfully for Type=forking, "READY=1" is sent for Type=notify, or the BusName= has been taken for Type=dbus). Note that ExecStartPre= may not be used to start long-running processes. All processes forked off by processes invoked via ExecStartPre= will be killed before the next service process is run. Note that if any of the commands specified in ExecStartPre=, ExecStart=, or ExecStartPost= fail (and are not prefixed with "-", see above) or time out before the service is fully up, execution continues with commands specified in ExecStopPost=, the commands in ExecStop= are skipped. В случае если между unit'ами указана зависимость Before или After systemd откладывает старт зависящего сервиса до тех пор пока другой не запустится: Before=, After= A space-separated list of unit names. Configures ordering dependencies between units. If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up. Note that this setting is independent of and orthogonal to the requirement dependencies as configured by Requires=. It is a common pattern to include a unit name in both the After= and Requires= option, in which case the unit listed will be started before the unit that is configured with these options. This option may be specified more than once, in which case ordering dependencies for all listed names are created. After= is the inverse of Before=, i.e. while After= ensures that the configured unit is started after the listed unit finished starting up, Before= ensures the opposite, i.e. that the configured unit is fully started up before the listed unit is started. Note that when two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied. i.e. if a unit is configured with After= on another unit, the former is stopped before the latter if both are shut down. Given two units with any ordering dependency between them, if one unit is shut down and the other is started up, the shutdown is ordered before the start-up. It doesn't matter if the ordering dependency is After= or Before=. It also doesn't matter which of the two is shut down, as long as one is shut down and the other is started up. The shutdown is ordered before the start-up in all cases. If two units have no ordering dependencies between them, they are shut down or started up simultaneously, and no ordering takes place.

Не удается опубликовать приложение уровня данных SQL Server 2014

#sql #sql_server #azure


Имеется две базы данных:


локальная - (localdb)\MSSQLLocalDB (SQL Server 12.0.2000)  
в azure -
sitename.database.windows.net (SQL Server 12.0.2000)


Раньше я делал "Извлечение приложения уровня данных" из второй базы, а затем "Публикация
приложения уровня данных" в локальную. Все выполнялось без ошибок.

Вчера обновил Visual Studio до последней версии, и теперь при выполнении этой процедуры
я получаю ошибку


  Проект, где указана целевая платформа База данных SQL Microsoft Azure
  версии 12, не может быть опубликован в SQL Server 2014


Делаю все манипуляции через SQL Server Explorer в студии.

UPD: обе базы создавал давно, еще до выхода обновлений, уровни совместимости должны
совпадать (120)
    


Ответы

Ответ 1



Несмотря на совпадающую версию, в Azure SQL V12 включены некоторые из новых фич SQL 2016. Поэтому в Visual Studio 2015 Update 2 проверку совместимости между Azure SQL и SQL Server поменяли на более строгую. Если вы ничем из новых фич не пользуетесь - просто отключите проверку совместимости - выставьте Allow Incompatible Platform в Advanced Publish options. Статья в Microsoft Connect на эту тему: Database project - cannot deploy to local SQL 2014

Уведомление о новом письме в Outlook

#c_sharp #outlook


Имеется плагин в outlook для уведомления и новом письме в дополнительном ящике. Но
проблема в том что когда приходит новое письмо и Outlook находится в свёрнутом состоянии
то уведомлении не отображается

Код ниже:

private void ThisAddIn_Startup(object sender, EventArgs e) {

    var ns = Application.GetNamespace("MAPI");
    const string recipientName = "mymail@mydomain.com";

    var recip = ns.CreateRecipient(recipientName);
    recip.Resolve();

    if (!recip.Resolved) return;
    var inboxFolder = ns.GetSharedDefaultFolder(recip, Outlook.OlDefaultFolders.olFolderInbox);
    inboxFolder.Items.ItemAdd += InboxFolderItemAdded;

}

private static void InboxFolderItemAdded(object item) {
    if (item is Outlook.MailItem) {
        MessageBox.Show("Новое сообщение", "new message", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}


Прошу оказать помощь в решении проблемы
    


Ответы

Ответ 1



Последуйте официальному примеру: сделайте Items полем. Проблема в том, что подписка действует до тех пор, пока объект жив. А после выхода из метода ThisAddIn_Startup() переменная inboxFolder и, соответственно, поле Items становится доступным для сборки мусора. Также имейте в виду, что согласно документации на это событие, оно не триггерится, если приходит сразу много сообщений (насколько много -- не уточняется :)). Outlook.Items _items; private void ThisAddIn_Startup(object sender, EventArgs e) { var ns = Application.GetNamespace("MAPI"); const string recipientName = "mymail@mydomain.com"; var recip = ns.CreateRecipient(recipientName); recip.Resolve(); if (!recip.Resolved) return; var inboxFolder = ns.GetSharedDefaultFolder(recip, Outlook.OlDefaultFolders.olFolderInbox); _items = inboxFolder.Items; _items.ItemAdd += InboxFolderItemAdded; } private static void InboxFolderItemAdded(object item) { if (item is Outlook.MailItem) { MessageBox.Show("Новое сообщение", "new message", MessageBoxButtons.OK, MessageBoxIcon.Information); } }

Восcтановить данные из потока ввода

#linux #c


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

Как после этого восстановить затертые данные и поместить их на следующую строку за
пришедшим сообщением? 

#include 
#include 
#include 

#include 

#define MAX_LEN 25

int main(int argc, char *argv[])
{
    char message[MAX_LEN];
    char answer[MAX_LEN] = "test\n";
    pid_t pid;

    pid = fork();

    if (pid < 0) {
        perror("fork()");
        exit(EXIT_FAILURE);
    }

    if (pid == 0) {
        read(STDIN_FILENO, message, MAX_LEN);        
    }

    if (pid > 0) {
        while (1) {
            sleep(2);
            write(STDOUT_FILENO, "\r", 1);
            write(STDOUT_FILENO, answer, strlen(answer));
        }
    }

    return 0;
}

    


Ответы

Ответ 1



Пример где это реализовано: наберите в командной строке sleep 2 и нажмите Enter, теперь пока команда sleep выполняется наберите что-то, но enter не нажимайте. Когда bash проснётся, он выводит приглашение а потом ваш ввод. Более простой интерпретатор dash так не умеет. Секрет состоит в отключении режима терминала ECHO, который повторяет вводимые символы, включении режима посимвольного ввода и реализации отображения вводимых символов своими силами либо с помощью библиотеки, например GNU Readline. В режиме посимвольного ввода read() будет возвращать результат, когда была нажата хотя бы одна клавиша (правда ещё зависит от размера буфера и параметров VMIN и VTIME, но в любом случае ожидается хотя бы один байт). Смотрите документацию в man tcsetattr. #include #include ... struct termios t; tcgetattr(2, &t); tcflag_t oldtcflags = t.c_lflag; t.c_lflag &= ~( ECHO | ICANON ); tcsetattr(2, TCSANOW, &t); // буфер ввода и позиция "курсора" в нём, первый символ - возврат в начало строки char input[80]="\r", i=1; // структура для poll, который используем перед read чтобы ждать ввода не более 1 секунды struct pollfd pollev= {fd:0, events:POLLIN}; // самый тупой редактор тупо заполняет буфер и повторяет его на вывод while(i<79) { char b; if(poll(&pollev, 1, 1000)) { if(read(0, &b, 1)!=1) break; input[i++]= b; } // если ничего не введено за одну секунду, всё равно обновим строку, вдруг сообщение испортило экран write(2, input, i); if(b=='\n') break; } input[i]=0; // Восстановление старого режима терминала t.c_lflag = oldtcflags; tcsetattr(2, TCSANOW, &t); // Далее в буфере input первый символ следует игнорировать ... Данная программа обновляет вводимую строку на экране раз в секунду и каждый раз после ввода очередного символа. Редактор рассчитан на то что stderr (он же дескриптор 2) связан с тем же терминалом, что и stdin (он же дескриптор 0). Если это не так (пользователь решил перенаправить вывод stderr), он вероятнее всего не увидит наши символы при вводе (если только он не использовал трубу в tee или что-то подобное). Т.е. в случае перенаправления stderr мы можем потерять эмуляцию эха. Поэтому я использовал тот же дескриптор для tcgetattr/tcsetattr: в случае перенаравления в файл или трубу эти функции не сработают и останется обычный построчный режим с эхом. В обычной командной строке все три дескриптора на самом деле доступны и на чтение и на запись (возможно в каких-то системах это не так). Полная эмуляция будет, если использовать дескриптор 0 для всех операций в редакторе (read, write, poll, tcgetattr, tcsetattr), это позволит пользователю перенаправлять вывод как угодно, если же он перенаправит ввод, write и управление терминалом не сработают. Вроде бы то, что нужно, но как мне кажется основано на недокументированных возможностях.

Сочетания клавиш в консоли, ввод-вывод

#cpp #windows #input #io #hotkeys


Учу С++. Хочу разобраться, как работает ввод-вывод в консоли.
Уже понял, что если вводишь в cin слова через пробел/табуляцию, он считывает их через
этот данный разделитель и выводит в cout. К примеру, ввожу "hello man", - выводит "helloman".
Это нормально, все ясно.
Также я узнал, что CTRL+Z останавливает процесс и означает символ конца файлы при
считывании. Нажимаю ctrl+Z (перед этим не ввожу символы) и процесс завершается.

Вопрос 1: почему, если я ввожу, к примеру "hello ^Z" (^Z я именно ввел сочетанием
клавиш, а не вручную сначала ^, потом Z), то сначала в потоке вывода появляется hello,
а за ним ничего не появляется, только если нажму enter, выводится вопросительный знак
в квадратике! (что это вообще такое?)

Вопрос 2: Если потом cin считывает символы через разделители, почему тогда он не
считал сначала hello, потом ^Z и в соответствии с командой не завершил процесс, считав
символ конца файла, как его называют в книге Страуструп.
Объясните, пожалуйста.

int main() {


    string current;

    while(cin>>current){

        cout << current;    
    }
}

    


Ответы

Ответ 1



Это особенности работы cmd.exe. cmd.exe отправляет текст в поток ввода построчно, и Ctrl+Z закрывает поток ввода только если до него не были введены другие символы. В этом можно убедиться переписав программу следующим образом: #include #include int main() { std::string s; while (std::cin >> s) for (int b : s) std::cout << std::hex << b << ' '; } Если что-то было введено до ^Z, то он интерпретируется как \x1a (символ замены), и всё что введено в этой строке далее - игнорируется: > test.exe 1^Z23 4 31 1a 34 При этом по умолчанию std::istream не считает \1a разделителем слов. Если до ^Z ничего не вводить, то поток закрывается, а последующие символы в строке игнорируются: > test.exe 123 31 32 33 ^Z456 >

Почему результат SELECT COUNT(*) FROM information_schema.tables -1?

#c_sharp #sql


Может мне кто-то объяснить в чем моя ошибка, что я получаю результыт от SQL-запроса
-1? Вот мой код:

    public static void proveIfQueryExecuted(String query, String database)
    {
        String sqlConnectionString = String.Format("Server = server; Database = {0};
Trusted_Connection = True;", database);

        using (SqlConnection connection = new SqlConnection(sqlConnectionString))
        {
            var server = new Server(new ServerConnection(connection));
            var result = server.ConnectionContext.ExecuteNonQuery(query);

            if (result != 0)
            {
                Console.WriteLine("tables exist");
            }
            else
            {
                Console.WriteLine("No tables exist");
            }

        }
    }

    


Ответы

Ответ 1



В данном случае вместо метода ExecuteNonQuery следует использовать метод ExecuteScalar: var result = server.ConnectionContext.ExecuteScalar(query); Метод ExecuteNonQuery обычно используется для выполнения команд, которые не предполагают возвращения какого-либо результирующего значения. Тогда как ExecuteScalar используется для выполнения команд, предполагающих возвращение какого-либо скалярного результирующего значения.

Как устроены, как работают и как самому сделать отменяемое событие?

#c_sharp #net #события


Например, в WinForms есть много событий, где можно вызвать e.Cancel=true и тогда
выполнение обработки события завершается.

Как оно устроеное, как работает и как самому реализовать такое событие?
    


Ответы

Ответ 1



В .NET есть стандартный класс CancelEventArgs. Если вам нужно передать в обработчик какие-то данные - создаете наследник от CancelEventArgs. Если не нужно - просто используете CancelEventArgs как есть. class MyEventArgs : CancelEventArgs { } class SomeClass { public event EventHandler SomeEvent; private bool OnSomeEvent() { var args = new MyEventArgs(); SomeEvent?.Invoke(this, args); return !args.Cancel; } public void SomeAction() { // наступило событие if (OnSomeEvent()) { // продолжить } else { // отменить } } } Если вы используете свои параметры для события, то наследоваться от CancelEventArgs необязательно - можно просто добавить bool Cancel к уже существующим данным.

Ответ 2



1) (Необязательно) В некоторых случаях, если кто-то отменил присвоение, полезно выбросить исключение, оповестив таким образом присваювающий код о отмене, хотя можно обойтись и просто проверкой удачности присвоения, или вообще проигнорировать отмену. Класс исключения, который я использую. [Serializable] /// Исключение возникает при прерывании выполнения setter для свойства public class SetterAbortException : Exception { public SetterAbortException() { } public SetterAbortException(string message) : base(message) { } public SetterAbortException(string message, Exception inner) : base(message, inner) { } protected SetterAbortException( System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } } 2) Понадобится класс-потомок EventArgs содержащий флаг отмены и данные предлагаемые к присвоению. Если подходящего нет в .Net, подключенных библиотеках или вашем решении, придётся создать. public class ValueChangingEventArgs : EventArgs { public ValueChangingEventArgs(decimal newvalue) { Cancel = false; NewValue = newvalue; } public bool Cancel { get; set; } public decimal NewValue { get; private set; } } 3) Создаём EventHandler соответствующий нашему EventArgs. public delegate void ValueChangingEventHandler(object sender, ValueChangingEventArgs ea); 4) Желательно реализовать закрытый/защищенный метод вызова события. /// /// Вызов события о начале изменения значения /// /// новое значение /// Разрешение продолжить значение protected virtual bool onValueChanging(decimal value) { var ea = new ValueChangingEventArgs(value); if (ValueChanging != null) { ValueChanging(this, ea); } return !ea.Cancel; } /// /// Событие возникает при начале изменения значения свойства Value /// public event ValueChangingEventHandler ValueChanging; 5) Осталось написать свойство с выбросом исключения при отмене или без него. private decimal value; /// /// Значение параметра в единицах СИ /// public decimal Value { get { return value; } set { if (!this.value.Equals(value)) //Проверяем новое значение присваивается или нет. Проверку можно убрать, если нужно, чтобы событие срабатывало даже, когда присваивается старое значение. { if (onValueChanging(value)) { this.value = value; onValueChanged(); //Вызов события о завершении присвоения } else // Удалить если не нужно исключение throw new SetterAbortException ("Присвоение прервано"); } } }

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

#javascript #html #jquery #css


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


Ответы

Ответ 1



Не утверждаю, что метод универсальный, т.к. требует поддержки CSS3, но посмотрите в сторону свойства CSS transform и @media. Например здесь приводится вариант его использования для увеличения до 150%: body { transform: scale(1.5); transform-origin: 0 0; } С помощью CSS запроса @media можно установить требуемые значения для различных разрешений экрана, а также комбинировать их с дополнительными условиями, такими как ориентация экрана или тип устройства (более подробно об использовании @media здесь или на русском здесь): @media all (max-width: 800px) { body { transform: scale(1.0); transform-origin: 0 0; } } @media screen and (max-width: 1024px) and (orientation: landscape) and (device-aspect-ratio: 16/9) { body { transform: scale(1.1); transform-origin: 0 0; } }

Ответ 2



Можно привязать размеры к ширине окна html{ font-size:calc(100vw/638); /* 100/ширина_для_которой_были_рассчитаны_размеры_в_пикселах */ } body{ font-size:16rem; } /* далее везде вместо px указывается rem */ div { width:100rem; /*100px*/ background:yellow; }
При ширине окна 638 данный блок будет шириной 100 пикселей
Заменив vw на vh, vmin, vmax можно привязать все размеры к высоте окна, минимальному или максимальному из двух размеров.

Обращение к git-dir через work-tree без симлинка

#git #macos #dropbox


Есть ~/work/project и ~/Dropbox/, в котором project → ~/work/project.

В самом ~/work/project папка .git вынесена в ~/work/project-git

Так вот, как без создания симлинка можно по прежнему вызывать git в ~/work/project?

Симлинк использовать нельзя так как дропбокс скопирует все содержимое. Может, ему
можно как-то сказать не делать этого?
    


Ответы

Ответ 1



адресоваться к каталогу с хранилищем (если он находится не в каталоге .git в корне проекта) можно разными способами. в вашем случае подойдёт адресация с помощью файла .git, описанная, например, в этом ответе. покажу на примере: рабочую копию (workdir) вы хотите держать в каталоге /путь/к/проекту а само хранилище (gitdir) хотите держать в каталоге /путь/к/хранилищу сделайте текущим каталог /путь/к/проекту: $ cd /путь/к/проекту инициализируйте хранилище: для программы git версии 1.7.5 или выше: $ git --separate-git-dir /путь/к/хранилищу init в каталоге /путь/к/хранилищу будет создано полноценное хранилище со всеми необходимыми файлами/каталогами: branches, config, description и т.д., а в текущем каталоге будет создан файл .git с «отсылкой» к месторасположению хранилища, такого содержания: gitdir: /путь/к/хранилищу для программы git версии ниже 1.7.5 надо будет проделать описанное в полу-ручном режиме: $ git --git-dir=/путь/к/хранилищу --work-tree=. init $ echo "gitdir: /путь/к/хранилищу" > .git для случая, если хранилище уже существует в каталоге .git в корне вашего проекта, потребуются такие действия: сделайте текущим каталог /путь/к/проекту $ cd /путь/к/проекту установите явно в конфигурации хранилища путь к рабочему каталогу: $ git config core.worktree /путь/к/проекту переместите каталог .git в нужное место с нужным именем (целевой каталог /путь/к/хранилищу не должен существовать в этот момент, иначе файлы/каталоги хранилища попадут в /путь/к/хранилищу/.git): $ mv .git /путь/к/хранилищу создайте файл .git в текущем каталоге: $ echo "gitdir: /путь/к/хранилищу" > .git

Масштабирование интерфейса WPF

#net #wpf


Было разработано приложение с использованием WPF.

Заказчик использует приложение на планшете и интерфейс мелковат для быстрой работы,
требуется увеличить все элементы, ну скажем, на 50%.

Как сделать это быстро и с меньшими затратами? В каждом Window применить к контейнеру
компоновки трансформацию Scale в RenderTransform? Попробовал сделать это на примере
одного из Window - окно и не знает, что содержимое увеличилось и оно в окно не влезает...

Как всё-таки правильно это сделать? На что при этом обратить внимание? А, может быть,
есть способ сделать масштабирование динамическим с возможностью смены коэффициента
во время работы (при работе с мышью ведь увеличение и не требуется)?
    


Ответы

Ответ 1



Ну, если решать проблему так, как вы хотите (масштабированием интерфейса), то подойдёт следующая идея. Пусть вы увеличиваете всё в k раз (у вас k = 1.5). Пишем так: (С удивлением обнаружил, что RenderTransform перемещает область hit test.) Однако мне кажется, что это не идеальное решение. Дело в том, что простое скалирование интерфейса не поможет. Майкрософт пробовала в ранних версиях Windows Phone скалирование десктопных интерфейсов, и отказалась от этого: при таком подходе страдает usability. Когда у вас мало места на экране, вы захотите не скалировать всё, а расположить элементы по-другому. Поэтому лучше следовать опыту Microsoft, и сделать для планшетов отдельный интерфейс, похожий на основной, но «заточенный» под меньший размер экрана и тач-управление. Будет выглядеть намного профессиональнее. Дополнение: Если вам нужно менять размер в зависимости от разных обстоятельств, проще всего сделать его параметром. Это делается так: В MainWindow кладём DependencyProperty типа double, назовём его ScalseFactor. Значение по умолчанию — 1.0. public double ScaleFactor { get { return (double)GetValue(ScaleFactorProperty); } set { SetValue(ScaleFactorProperty, value); } } public static readonly DependencyProperty ScaleFactorProperty = DependencyProperty.Register( "ScaleFactor", typeof(double), typeof(MainWindow), new PropertyMetadata(1.0)); Вместо константы 1.5 в ScaleY прописываем привязку: {Binding ScaleFactor, ElementName=Main} (даём окну имя Main, чтобы было проще привязывать). Для привязки ColumnDefinition нам нужно вычесть единицу и перейти от double к типу GridLength, поэтому используем конвертер. Для начала определим его: class RestGridLengthConverter : IValueConverter { public object Convert(object value, Type tt, object parameter, CultureInfo ci) { return new GridLength((double)value - 1, GridUnitType.Star); } public object ConvertBack(object value, Type tt, object parameter, CultureInfo ci) { throw new NotImplementedException(); } } Кладём в ресурсы и привязываем: Всё, теперь у нас можно настраивать увеличение при старте программы (или вообще когда угодно), используя ScaleFactor. Например, можно прикрутить к нему слайдер. Вот полный пример: namespace Example { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public double ScaleFactor { get { return (double)GetValue(ScaleFactorProperty); } set { SetValue(ScaleFactorProperty, value); } } public static readonly DependencyProperty ScaleFactorProperty = DependencyProperty.Register( "ScaleFactor", typeof(double), typeof(MainWindow), new PropertyMetadata(1.0)); } } namespace Example { class RestGridLengthConverter : IValueConverter { public object Convert(object value, Type tt, object parameter, CultureInfo ci) { return new GridLength((double)value - 1, GridUnitType.Star); } public object ConvertBack(object value, Type tt, object parameter, CultureInfo ci) { throw new NotImplementedException(); } } } Результат: