Страницы

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

вторник, 7 января 2020 г.

Аналог NFS (распределенное сетевое хранилище) для Windows 7

#windows #сеть


Здравствуйте!В сети есть один сервер под Ubuntu (DHCP + DC + smb) и один NAS. На
NAS делается бэкап с сервера, а он сам не бэкапится. В то же время клиентских машин
уже под 50 и на них в принципе есть как минимум по 50-100 Гб не используемого места.
Нужно организовать распределенное файловое хранилище.В связи с тем что все машины (кроме
сервера и шлюза) под Windows XP/7, то нужен инструмент который можно было использовать
на них (аналог NFS).Вопрос в том каким ПО под Windows XP/7 можно организовать распределенное
сетевое хранилище?PSНебольшую подборку (opennet.ru) ПО я уже нашел - по возможности
опробую, но меня интересует советы людей реально работавших / работающих с подобным.    


Ответы

Ответ 1



Хреновая это идея. Все распределенные ФС крайне не любят выпадения нод. А винды будут регулярно ребутаться. В итоге вся эта конструкция со временем упадет или потеряет половину файлов.

Ответ 2



Настоящая распределённая сетевая файловая система, на сколько мне известно, штука весьма сложная, требовательная и вообще. В общем это не то что стоит использовать в вашей ситуации.Наверное будет лучше сообразить какий-то велосипед раскидывающий бекапы по smb-шарам на виндовых машинах (с учётом свободного места на них). Можно не умничать и раскидывать бекапы рандомно по тем шарам на которых ещё осталось достаточно места (для удобства можно потом собирать всё это в кучу каким-то AUFS-ом), а можно соорудить что-то замороченное с репликацией бекапов на несколько хостов.Но в целом эта затея с бекапом на клиентские машины кажется мне чреватой осложнениями.

Структура таблицы MySQL для архивирования данных различных типов

#mysql


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

Сейчас структура такая:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| tag_id     | int(11)      | YES  | MUL | NULL    |                |
| value      | varchar(255) | NO   |     | NULL    |                |
| date       | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+


date - время измерения;
value - значение параметра;
tag_id - ссылка на другую таблицу с описанием параметра.

Чутье подсказывает, что хранить числа в строке неправильно. Как быть, посоветуете?
    


Ответы

Ответ 1



По-хорошему надо приводить любой архивируемый тип к типу архива самостоятельно. Например есть сериализация, т.е. перевод любого значения в строку. Или можно конвертировать любой тип в бинарные данные. Соотв. использовать или text/varchar (у последнего ограничение по символам) или blob

Ответ 2



Можете хранить значения в отдельных колонках: столько колонок, сколько у вас "параметров". Каждая колонка с нужным типом, у каких-то колонок тип может совпадать, это непринципиально. Все колонки с атрибутом NULL. Это как раз тот случай, когда null-able уместен. CREATE TABLE `multi` ( `id` int(10) NOT NULL AUTO_INCREMENT, `tag_id` int(11) NOT NULL, `field_a` int(10) NULL, `field_b` float(10,2) NULL, `field_c` tinyint(1) NULL, PRIMARY KEY (`id`) ); Писать и добывать в/из разных колонки зависимости от tag_id. Если понадобится имитировать одну универсальную колонку, то можно использовать доступ к полю по номеру: SELECT tag_id, ELT(tag_id, field_a, field_b, field_c) AS value FROM multi

Ответ 3



Вообще, задача не полна без описания алгоритма дальнейшего использования. По какому принципу потом в эту таблицу будут запросы делаться? Почему tag_id может быть NULL? Насколько я понимаю, именно по нему будет определяться, что же за параметр тут сохранен? Так-то делал бы так. Допускаем, что в таблице с описанием есть поле type, описывающие тип параметра CREATE TABLE main ( id int(11) NOT NULL AUTO_INCREMENT, tag_id int(11) NOT NULL, PRIMARY KEY(id) ); CREATE TABLE int_values ( id int(11), value int(11), FOREIGN KEY (id) REFERENCES main(id) ); CREATE TABLE bool_values ( id int(11), value BOOL, FOREIGN KEY (id) REFERENCES main(id) ); и так далее.

Ответ 4



Почему бы не завести по таблице на каждый тип + таблицу-индекс?

Вывод из текста самого длинного и короткого слова

#алгоритм #строки #cpp


Вот такой вариант. Из файла берем какой-то текст и выводим мин. и макс. количество
символов между пробелами, как сделать аналог? (Только с использованием строк, а не
записывать все в переменные.)

#include 
#include 
#include 
#include 
#include 
using namespace std;

int main(int argc, char*argv[])
{
setlocale(LC_ALL,"rus");
char buff[500];    //буфер хранения считываемого текста из файла
ifstream text("text.txt");  //открываем файл
if (!text.is_open()) // если файл не открыт
{
    cerr<<"Файл не найден."<max)
            {   
                max=countw;     //кол-во символов
                maxw=i;        //индекс последнего символа
            }
            else if(countw


Ответы

Ответ 1



Чтобы напечатать самое короткое и самое длинное слово во входном тексте можно использовать istream_iterator, чтобы разбить текст на слова, разделённые пробелом, и minmax_element со специальным сравнителем size_less, чтобы найти кратчайшее и длиннейшее слова: /** Print the shortest and the longest whitespace-separated words in the input. To try: $ g++ -std=c++11 print-minmax-words.cpp && // minmax #include #include // istream_iterator #include bool size_less(const std::string& a, const std::string& b) { return a.size() < b.size(); // compare word sizes in bytes } int main() { using namespace std; // skipws is set, the currently imbued locale is used to determine // whether a charT is whitespace //NOTE: Windows, OS X, Linux demonstrate different behavior // - Windows may corrupt even a byte stream (ANSI conversions) // - OS X might limit available locales (relevant for wide streams) if (cin.getloc().name() != "C") { cerr << "warning: what whitespace is depends on locale: '" << cin.getloc().name() << "'\n"; } istream_iterator words(cin), eof; auto p = minmax_element(words, eof, size_less); if (p.first == eof && p.second == eof) { cerr << "there are no words in the input\n"; return 1; } else if(!(cout << *p.first << ": " << (*p.first).size() << ", " << *p.second << ": " << (*p.second).size() << endl)) return 2; // I/O error return cin.eof() ? 0 : 2; } Ввод 00 01 020304 0506070809 10…11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25
 26 27 28 Вывод 00: 2, 10…11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25
 26 27 28 : 93 Входной файл содержит Юникодные пробелы, пронумерованные двузначными цифрами (программа, которая поддерживает Юникод, вернула бы наибольшую и наименьшую длину слова равную 2, вместо 2 и 93 как пример выше, который работает только со ASCII стандартными пробелами). Если нужно вывести только длины самого короткого и самого длинного слова (символы, разделённые пробелом), то не обязательно сами слова хранить. Вот C программа, которая читает один байт за раз из стандартного ввода (stdin), разделяя ввод на слова, если встречен стандартный пробел ' \t\n\r\v\f'. Реализация поддерживает слова длиною до UINTMAX_MAX байт (18446744073709551615 на моей машине -- примерно полвека работы со скоростью 100 гигабит в секунду): /** Print min, max whitespace-separated word sizes in the input. To try: $ gcc print-minmax-word-size.c && /* PRIuMAX */ #include #include int main(void) { /* ^(\S|\s)*$ */ uintmax_t wordlen = 0, minlen = UINTMAX_MAX, maxlen = 0; int c; while ((c = getchar()) != EOF) { switch(c) { case ' ': case '\f': case '\n': case '\r': case '\t': case '\v': /* equivalent to isspace(c) in C locale */ if (wordlen) { /* end of word, update min, max lengths */ if (minlen > wordlen) minlen = wordlen; if (maxlen < wordlen) maxlen = wordlen; wordlen = 0; } break; default: /* not whitespace, inside a word */ ++wordlen; }; } if (wordlen) { /* end of word, update min, max lengths */ if (minlen > wordlen) minlen = wordlen; if (maxlen < wordlen) maxlen = wordlen; } /** Report results. Exit status is like grep: 0 -- success 1 -- no words found 2 or greater -- an error */ if (minlen == UINTMAX_MAX && maxlen == 0) { fputs("there are no words in the input\n", stderr); exit(1); } else if (printf("%" PRIuMAX " %" PRIuMAX "\n", minlen, maxlen) < 0) exit(2); return feof(stdin) ? 0 : 2; } Программа выводит длину слов в байтах. Длина в символах (буквы, которые на экране видны) может отличаться в зависимости от кодировки входного текста и его нормировки (bytes -> Unicode codepoints -> user-perceived characters (grapheme clusters)).

Как сверстать список-содержание с многоточием на конце?

#css


Необходимо сверстать такой список:
Text Text Text Text ..................................................................................123
Text Text Text ..........................................................................................123
Text Text Text Text Text
Text Text Text Text Text Text ..........................123
Text Text Text Text
Text Text Text ..........................................................123
Можно ли это реализовать средствами css. Если да, то как?
Спасибо.    


Ответы

Ответ 1



Сверстать линии разной длины Посмотрите ответы в этой теме, тут есть несколько вариантов реализации.

Как получить список доступных шрифтов в Delphi?

#delphi #шрифты


Как получить список доступных в системе шрифтов и, например, закинуть его в ComboBox
на форме?
    


Ответы

Ответ 1



Свойство Fonts типа TStrings содержит список шрифтов, доступных на данном компьютере. Его можно использовать в приложении, чтобы проверять, имеется ли на компьютере тот или иной шрифт. Например, можно поместить в приложении компонент TComboBox (поле со списком) и в обработчике события OnCreate формы поместить туда перечень всех доступных шрифтов: ComboBox1.Items := Screen.Fonts; ComboBox1.ItemIndex := 0; Тогда в нужный момент можно выбрать подходящий шрифт из списка. Для этого в обработчик события OnClick или OnChange списка можно вставить следующий оператор: Memo1.Font.Name := ComboBox1.Items[ComboBox1.ItemIndex];

/*# sourceMappingURL=modal.css.map */ - что значит?

#javascript #css


В modal.css прописана строчка в конце файла
/*# sourceMappingURL=modal.css.map */.

В консоле пишет: 
GET http://landinco.ru/wp-content/themes/Divi/albanza/css/modal.css.map 404 (Not Found).

Что это означает и где взять ее? В скрипте такого файла нет...    


Ответы

Ответ 1



Это значит, что данный CSS код был сгенерирован с помощью какого-то CSS-препроцессора с использованием Карты Кода(Source Map). Если в этом файле тебе всё понятно(или разбираться в нём не нужно) и работает он корректно, то эту строку можно смело удалить. Прочитать про карты кода можно тут http://habrahabr.ru/post/148098/

Обновление свойства, привязанного к контролу, из другого потока

#c_sharp #wpf #mvvm #async_await


Всем привет. Есть пользовательский элемент управления. Упрощенная его разметка показана
ниже:

    
        

    


Codebehind данного элемента управления:
public partial class MyCanvas : UserControl
{
    public MapControl()
    {
        InitializeComponent();
    }

    static MapControl()
    {
        MyBackgroundProperty = DependencyProperty.
            Register("MyBackground", typeof(Brush), typeof(MapControl));
    }

    public static DependencyProperty MyBackgroundProperty;
    public Brush MyBackground
    {
        get { return (Brush)GetValue(MyBackgroundProperty);}

        set { SetValue(MyBackgroundProperty, value); }
    }
}

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


   


Также есть следующая MainWindowViewModel, которая биндится к главному окну приложения:
public class MainViewModel : ViewModelBase
{
    private IMyService _service;

    private ImageBrush _image; 
    public ImageBrush Image 
    {
        get { return _image; }

        set 
        { 
           _image= value; 
           OnPropertyChanged("Image"); 
        }
    }

     private int _zoom; 
     public int Zoom 
     {
          get { return _zoom; }

          set 
          { 
               _zoom = value; 
               OnPropertyChanged("Zoom");

               // Обновляю картинку асинхронно.
               UpdateImage();                
          }
     }

    private async void UpdateImage()
    {
        // Данный метод возвращает новую картинку!
        // Картинка возвращается как Task
        Image = await _service.GetNewImageTaskAync();

        // Далее происходит исключение:
        // Необходимо создать DependencySource в 
        // том же потоке, в котором создан DependencyObject
    }
}

Проблема заключается в том, что если я обновляю свойство Image данными, полученными
из другого потока, то я получаю исключение "Необходимо создать DependencySource в том
же потоке, в котором создан DependencyObject".
Пробовал по-разному синхронизировать потоки, но ничего не получилось.
Подскажите, пожалуйста, как мне в свойство Image "положить" данные, созданные в другом
потоке.    


Ответы

Ответ 1



Кажется, понятно. Весь код, который вы привели, правильный. Ошибка должна быть в GetNewImageTaskAync. Либо нужно создавать image в UI-потоке, либо после создания вызвать на нём Freeze().