• Как защититься от передачи пользователями аккаунтов третьим лицам?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    1. Страшное пользовательское соглашение, где будет сказано, что за добровольную передачу своей учетной записи третьим лицами, запись может быть блокирована и безвозвратно удалена.

    2. Привязка к номеру телефона и вход с подтверждением по SMS.

    3. Сделать обязательным указание паспортных данные, которые будут доступны пользователю в профиле (лично). Возможность обновлять только через проверку модератором. Тогда пользователь несколько раз подумает, прежде чем добровольно передавать свои учетные данные кому-либо. Но придется и со стороны проекта усиливать меры безопасности, юридически в том числе. Проверить достоверность паспортных данных можно на сайте ФМС.

    Но это лишь усложнит процесс работы с сайтом. Все равно будет возможность выполнять задания чужими руками, даже если это придется делать в режиме реального времени по Skype.
    Ответ написан
    Комментировать
  • Почему не работает калькулятор?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Дело в десятичном разделителе:
    string value = textBox1.Text;
    // меняем разделитель на текущий
    value = System.Text.RegularExpressions.Regex.Replace(value, @",|\.", System.Globalization.NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator);
    // преобразуем строку в число
    var result = double.Parse(value);

    Преобразование типов.
    Ответ написан
    4 комментария
  • Как правильнее вставить в JS код длинный блок html кода?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Проще сделать этот блок невидимым и показывать после выполнения авторизации пользователя.
    if (answ.error == 0) {
      $('#кнопкаВхода').hide();
      $('#home-button').show();
    }

    Ну или ответом на AJAX может быть HTML :-) Но вариант с изначально существующим блоком лучше, т.к. он (блок) все равно будет на странице.
    Ответ написан
    5 комментариев
  • Как добавить контент в tbody таблицы с известным ID на JQuery?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    При условии:
    <table id="messages">
    <tbody></tbody>
    </table>

    будет:

    $('table#messages tbody').append('<tr><td>test</td></tr>');

    или

    $('table#messages>tbody').append('<tr><td>test</td></tr>');

    или

    $('tbody', 'table#messages').append('<tr><td>test</td></tr>');
    Ответ написан
    1 комментарий
  • Asp.NET WebForms или MVC?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    ASP .NET WebForms - простые, относительно. Они скорее для начинающих подходят. В WebForms множество готовых компонентов, но большая часть сомнительного качества (в плане производительности). Можно делать простенькие сайты (хотя, можно и не простенькие, если сервер и пользователей не жалко) достаточно быстро и с минимальными знаниями HTML, CSS и JavaScript. Если потребуется нечто большее, то с ASP .NET WebForms придется изрядно повозиться и не факт, что будет достигнут желаемый результат.

    Хотя ASP .NET WebForms развиваются и, сейчас, проще и удобней получить контроль над происходящим, чем например в ранних версия (1.x/2.0/3.5). Но все равно, будет множество ограничений и для крупных проектов WebForms годятся плохо. Отмечу, что ASP .NET WebForms хороши вместе с Visual Basic .NET - работать удобней, чем с C#.

    Чтобы делать под ASP .NET WebForms нормальные проекты, придется делать это руками, минимизировать использование стандартных компонентов и решений. Но тогда все фишки WebForms превращаются в один большой геморрой. Жить можно, но не очень приятно :-)

    В ASP .NET MVC полный контроль над всем происходящим, нет ограничений, но и больше ручной работы и требуется больше знаний.

    Лучше всего использовать ASP .NET MVC совместно с Razor и C#. Работать будет удобнее, код лаконичней и красивее.

    Я сейчас даже простые проекты делаю на ASP .NET MVC.

    Не сказал бы, что время ASP .NET WebForms прошло, оно все еще идет. Частенько приходится отвечать на вопросы по теме работы с WebForms. Собственно, по этой причине я и знаю о некоторых позитивных изменениях в последних версиях WebForms. Сайты, сделанные на WebForms тоже попадаются часто (обращаю на это внимание, даже когда специально не смотрю). Сам уже не использую, но старых проектов осталось много, надеюсь когда-нибудь и они будут переделаны на MVC.
    Ответ написан
    2 комментария
  • Как подключить к веб-приложению (ASP.NET MVC 4) БД MySql?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Необходимо скачать и установить Connector/Net.

    Работать также как и с любыми другими базами в .NET.

    Основные классы:
    • MySqlConnection - для подключения к базе;
    • MySqlCommand и MySqlDataAdapter - формирование запросов и получение данных.

    Подробности можно найти в документации.
    Ответ написан
    Комментировать
  • Как отсортировать элементы по атрибуту?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Пример с использованием jQuery:
    $('li[sort]').sort(function (a, b) {
      return parseInt($(a).attr('sort'), 10) < parseInt($(b).attr('sort'), 10) ? -1: 1;
    }).appendTo('ul');

    Посмотреть результат.

    И да, для пользовательских атрибутов лучше использовать префикс data-, чтобы все соответствовало стандартам :-)

    Вот еще пример, с изменением направления сортировки.
    Ответ написан
    Комментировать
  • Какие требования у.NET при стандартной сериализации?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Чтобы класс можно было сериализовать, необходимо пометить его атрибутом [Serializable].
    [Serializable]
    public class MyClass 
    {
    }

    Атрибут [Serializable] также должны иметь все типы, которые включены в класс. Если у какого-то из типов не будет этого атрибута, то при попытке выполнить сериализацию, возникнет исключение. Это минимум, что необходимо.

    Для двоичной сериализации используется класс BinaryFormatter.
    // данные, которые будем сериализовать
    var data = new List<int> { 1, 2, 3 };
    
    // выполняем сериализацию 
    // в MemoryStream (можно в любой Stream)
    var bf = new BinaryFormatter();
    var m = new MemoryStream();
    bf.Serialize(m, data);
                
    // курсор потока переводим в начало, т.к. мы работали с потоком выше
    // если открывать новый поток, то это делать не обязательно
    m.Position = 0;
    // выполняем десериализацию данных из MemoryStream
    var result = (List<int>)bf.Deserialize(m);
    
    // выводим результат в консоль
    result.ForEach(itm => Console.WriteLine(itm));


    Если в объекте попадется тип, который не помечен атрибутом [Serializable], то можно реализовать в классе интерфейс ISerializable. Либо сделать для этого типа отдельный класс, реализующий интерфейс ISerializable. При этом, не забывая про атрибут [Serializable], который обязательно должен присутствовать.

    При реализации интерфейса ISerializable, в классе нужно определит метод GetObjectData, который будет подготавливать данные для сериализации. А также реализовать перегрузку конструктора для принятия сериализованных данных.
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
      if (info == null)
      {
        throw new ArgumentNullException("info");
      }
      info.AddValue("Ключ", "Значение");
      info.AddValue("Ключ2", this.ИмяСвойства); 
      // и т.д.
    }
    
    // конструктор
    protected ИмяКласса(SerializationInfo info, StreamingContext context)
    {
      if (info == null)
      {
        throw new ArgumentNullException("info");
      }
      this.Свойство = info.GetValue("Ключ", typeof(типДанных));
      this.ИмяСвойства = (string)info.GetValue("Ключ2", typeof(string));
      // и т.д.
    }

    Часто спрашивают, как сериализовать Dictionary<TKey, TValue>. На основе всего выше изложенного, можно сделать вот такой класс:
    [Serializable]
    public class MyDictionary : Dictionary<string, object>, ISerializable
    {
    
      public MyDictionary() { }
    
      protected MyDictionary(SerializationInfo info, StreamingContext context)
      {
        if (info == null)
        {
          throw new ArgumentNullException("info");
        }
        int count = info.GetInt32("Count"); // получаем число элементов
        for (int i = 0; i < count; i++) // перебираем элементы
        {
          // получаем ключ и значение по индексу элемента
          string key = info.GetString(String.Format("ItemKey{0}", i));
          object value = info.GetValue(String.Format("ItemValue{0}", i), typeof(object));
          // добавляем элемент в себя
          this.Add(key, value);
        }
      }
    
      public void GetObjectData(SerializationInfo info, StreamingContext context)
      {
        if (info == null)
        {
          throw new ArgumentNullException("info");
        }
        // перебираем все элементы коллекции
        int i = 0;
        foreach (KeyValuePair<string, object> item in this)
        {
          // добавляем отдельно ключ и значение
          info.AddValue(String.Format("ItemKey{0}", i), item.Key, typeof(string));
          info.AddValue(String.Format("ItemValue{0}", i), item.Value);
          i++;
        }
        // запоминаем, сколько всего элементов
        info.AddValue("Count", this.Count);
      }
    }

    Пример использования:
    // выполняем сериализацию коллекции
    var data = new MyDictionary();
    data.Add("Key", "Value");
    data.Add("Key2", "Value2");
    data.Add("Key3", 123);
    
    var bf = new BinaryFormatter();
    var m = new MemoryStream();
    bf.Serialize(m, data);
    
    // выполняем десериализацию
    m.Position = 0;
    var result = (MyDictionary)bf.Deserialize(m);
    
    // выводим результат
    foreach (var item in result)
    {
      Console.WriteLine("{0} = {1}", item.Key, item.Value);
    }

    Посмотреть в .NET Fiddle, как это работает.
    Ответ написан
    Комментировать
  • Entity framework validation for decimal type. Как сделать чтобы пропускало дробное значение?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Для редактирования использовать тип string. Перед сохранение в базу преобразовывать в decimal.
    В своих проектах использую вспомогательный класс, который имеет методы для работы с числами и умеет понимать любой десятичный разделитель. Конкретно, для данной ситуации, есть метод ToDecimal (код открыт, лицензия не запрещает использовать частями, если что).

    [DisplayName("Сумма")]
    public string Sum { get; set; }
    
    public decimal SumDec 
    { 
      get
      { 
        return Convertion.ToDecimal(this.Sum); 
      }
    }
    Ответ написан
    Комментировать
  • Разве StringWriter унаследован от Stream?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Метод Serialize перегружен и, помимо прочего, может принимать TextWriter, от которого наследуется StringWriter.
    Ответ написан
    Комментировать
  • Как получить выполняемые запросы в браузере?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Запомнить, какие запросы были отправлены, и проверять:
    var requests = [];
    requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
    requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
    requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
    requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
    requests.push($.ajax({type: 'GET', url: '/echo/json/'}));
    
    console.log(requests);
    
    function Test(){
        $.each(requests, function(i, req){
            if(req.readyState == 0 || req.readyState == 4){
                console.log(req.status + ': ' + req.statusText);        
            }else{
                console.log(req.readyState);        
            }
        });
    }
    
    Test();
    
    window.setTimeout(Test, 3000);

    Посмотреть пример.
    Можно удалять запросы из коллекции по завершению их выполнения.
    Ответ написан
    2 комментария
  • Как сделать, чтобы внутренние страницы сайта открывались в определенной позиции?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Проще разместить якоря и переходить к ним (браузер сам переместит страницу к якорю):
    <h1 id="перейтиСюда">Заголовок</h1>
    ...
    <h1 id="илиСюда">Заголовок 2</h1>

    http://example.org/#перейтиСюда
    http://example.org/#илиСюда
    http://example.org/#idЭлементаНаСтранице
    Ответ написан
    6 комментариев
  • Какая кодировка подойдёт для get запроса (замена base64)?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    var result = encodeURIComponent('кодированный текст here');
    alert(result);
    alert(decodeURIComponent(result));

    Посмотреть пример.

    Вариант с base64:
    var result = $.base64.encode(encodeURIComponent("вот такой вот метод кодирования\nраз, два, три!"));
    result = result.replace(/[\+]{1}/g, '@').replace(/[\=]{1}/g, '~').replace(/[\/]{1}/g, '$');
    console.log(result);
    
    result = result.replace(/[\@]{1}/g, '+').replace(/[\~]{1}/g, '=').replace(/[\$]{1}/g, '/');
    console.log(result)
    console.log(decodeURIComponent($.base64.decode(result)));

    Результат:
    Измененный вид Base64:
    JUQwJUIyJUQwJUJFJUQxJTgyJTIwJUQxJTgyJUQwJUIwJUQwJUJBJUQwJUJFJUQwJUI5JTIwJUQwJUIyJUQwJUJFJUQxJTgyJTIwJUQwJUJDJUQwJUI1JUQxJTgyJUQwJUJFJUQwJUI0JTIwJUQwJUJBJUQwJUJFJUQwJUI0JUQwJUI4JUQxJTgwJUQwJUJFJUQwJUIyJUQwJUIwJUQwJUJEJUQwJUI4JUQxJThGJTBBJUQxJTgwJUQwJUIwJUQwJUI3JTJDJTIwJUQwJUI0JUQwJUIyJUQwJUIwJTJDJTIwJUQxJTgyJUQxJTgwJUQwJUI4IQ~~
    
    Возвращаем нормальный вид Base64:
    JUQwJUIyJUQwJUJFJUQxJTgyJTIwJUQxJTgyJUQwJUIwJUQwJUJBJUQwJUJFJUQwJUI5JTIwJUQwJUIyJUQwJUJFJUQxJTgyJTIwJUQwJUJDJUQwJUI1JUQxJTgyJUQwJUJFJUQwJUI0JTIwJUQwJUJBJUQwJUJFJUQwJUI0JUQwJUI4JUQxJTgwJUQwJUJFJUQwJUIyJUQwJUIwJUQwJUJEJUQwJUI4JUQxJThGJTBBJUQxJTgwJUQwJUIwJUQwJUI3JTJDJTIwJUQwJUI0JUQwJUIyJUQwJUIwJTJDJTIwJUQxJTgyJUQxJTgwJUQwJUI4IQ==
    
    Декодируем Base64:
    вот такой вот метод кодирования
    раз, два, три!

    Посмотреть пример.

    С кодировками текста не стал разбираться, просто сделал encodeURIComponent/decodeURIComponent. Проблему с кодировками, в принципе, можно решить более человеческим способом, если это необходимо и есть желание :-)
    Ответ написан
    5 комментариев
  • Кто может посоветовать сервер для аутентификации?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Я недавно выпустил библиотеку с формами аутентификации через социальные сети по протоколу OAuth. На данный момент есть клиенты для 17 популярных сервисов.

    Исходный код открыт, распространяется под лицензией Apache 2.0.

    Пример использования:
    // создаем форму для Dropbox
    var login = new DropboxLogin("5nkunr8uscwfoba", "n7x9icfwoe6dehq") { Owner = this };
    // показываем форму
    login.ShowDialog();
    // если пользователь авторизован
    if (login.IsSuccessfully)
    {
      // можем получить маркер доступа и использовать для работы с API Dropbox
      MessageBox.Show("Маркер доступа: " + login.AccessToken.Value);
    }
    Ответ написан
    Комментировать
  • Как воспользоваться zeroclipboard?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Довольно капризная штука. Сколько раз сталкивался, постоянно какие-то проблемы.

    <div class="main-body">
    	<div class="result">
    		<div id="source">Скопируй меня, если не боишься!</div>
    	</div>
    	<button id="ButtonCopy">Копировать</button>
    </div>
    
    <script src="ZeroClipboard.min.js" type="text/javascript"></script>
    
    
    <script type="text/javascript">
    	var CopyText = document.getElementById('source').innerHTML;
    	var clip = new ZeroClipboard(document.getElementById('ButtonCopy'), { moviePath: 'ZeroClipboard.swf' });
    
    	clip.on('mousedown', function (client) {
    		client.setText(CopyText);
    	});
    
    	clip.on('complete', function (client, args) {
    		alert('Текст: "' + args.text + '" успешно помещен в буфер обмана!');
    	});
    
    	clip.on('noflash', function (client) {
    		alert("А <s>компот</s> Flash?");
    	});
    </script>


    Если просто в браузере открыть, может не сработать. Нужно с localhost или с сайта смотреть.

    Вот пример, у меня работает.
    Ответ написан
    1 комментарий
  • Visual Basic метод или операция не осуществляется?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Код вижу, вопрос непонятен. Нужно больше букв, желательно в виде слов, образующих предложения, наполненных смыслом :)

    По коду, вот здесь:

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        OpenFileDialog1.ShowDialog()
        TextBox1.Text = OpenFileDialog1.FileName
    End Sub


    Нет обработчика результата работы диалогового окна. Должно быть что-то типа:

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ' если пользователь не захотел выбирать файл, выходим
        If Not OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then Return 
        ' пользователь выбрал файл
        TextBox1.Text = OpenFileDialog1.FileName
    End Sub


    Вот в этой строчке:

    If TextBox1 = Acct_NoTextbox.Text Then

    Лучше явно указать свойство Text при проверке значения элемента TextBox1:

    If TextBox1.Text = Acct_NoTextbox.Text Then

    Хотя, если сделать нормальную работу OpenFileDialog, как я показал выше, то в этом условии необходимость вообще должна отпасть. Ну или можно просто проверять наличие значения в TextBox1:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
          Try
                ' если значение TextBox1.Text - пустая строка или Nothing, то
                If String.IsNullOrEmpty(TextBox1.Text) Then 
                    MessageBox.Show("Select file for get size!")
                    Return ' выходим
                End If
    
                'можно сразу создать FileInfo и проверять существование файла через него
                Dim file As New System.IO.FileInfo(TextBox1.Text)
                If file.Exists Then
                    MessageBox.Show(file.Length & "Bytes")
                Else
                    MessageBox.Show("Thise file is not existes on your PC")
                End If
          Catch ex As Exception
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
          End Try
    End Sub
    Ответ написан
    Комментировать
  • JQuery. Поиск элемента и получение данных в массиве?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    function GetCategoryByArt(art){
        var result = $.grep(arr, function(cat){
            return $.grep(cat.products, function(product){
                return product.art == art;
            }).length > 0;
        });
        return result.length > 0 ? result[0] : null;
    }
    
    function GetProductByArt(art){
        var result = null;
        $.each(arr, function(i, cat){
            $.each(cat.products, function(j, product){
                if(product.art == art)
                {
                    result = product;
                    return;
                }
            });
            if(result){ return; }
        });
        return result;
    }
    
    alert(GetCategoryByArt("3").title);
    alert(GetProductByArt("3").prodname);

    jsfiddle.net/alekseynemiro/pafthz0h
    Ответ написан
    Комментировать
  • Как пройти такой unit test?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Без читов точно не пройти! :-)

    Странный вопрос. Запустить проект, в котором размещен этот тест и посмотреть на отчет.
    Если будут ошибки, внеси соответствующие исправления в код. Обычно это делается так.

    ----------
    Подведу итоги по результатам дискуссии в комментариях.

    1. Простые/тупые варианты пройти тест успешно, по крайней мере технически, это внести изменения в данные:

    return x > value - 1000; // убираем лишнюю тысячу :)

    return x + 1000 > value; // добавляем

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

    var value = 0;
    var value2 = value;
    var predicates = new Predicate[]
    {
      x => x > value2
    };


    3. Еще могу предложить построить дерево. Но это сложное решение, кода больше. Хотя, если вы проходили/изучаете именно эту тему, то вполне возможно, что этот вариант может быть правильным.

    // using System.Linq.Expressions;
    
    [TestMethod]
    public void FunctionExtention_CombinePredicates_Should_Avoid_Closure()
    {
        var value = 0;
    
        var iks = Expression.Parameter(typeof(int), "x");
        var v = Expression.Constant(value, typeof(int)); // фиксируем значение value 
        var less = Expression.LessThan(v, iks);
        var l = Expression.Lambda<Func<int, bool>>(less, new ParameterExpression[] { iks }).Compile();
    
        var predicates = new Predicate<int>[]
        {
          x => l(x)
        };
        var result = FunctionExtentions.CombinePredicates(predicates);
        value = 1000; // This should not affect the call above!
        Assert.IsTrue(result(2));
        Assert.IsTrue(result(5));
        Assert.IsTrue(result(1000));
        Assert.IsFalse(result(-20));
        Assert.IsFalse(result(0));
        Assert.IsFalse(result(-1000));
    }
    
    public static Predicate<T> CombinePredicates<T>(Predicate<T>[] predicates)
    {            
        return item => predicates.All(predicate => predicate(item));
    }
    Ответ написан
  • Как сделать переход в jquery autocomplette?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Обрабатывать события change, select и close. Использовать дополнительный атрибут, который будет содержать признак выбранности значения из списка:
    $( "#tags" ).autocomplete({
          source: availableTags,
          change: function(){
            $(this).attr('data-select', $(this).val() != '');
          },
          select: function(){
            $(this).attr('data-select', true);
          },
          close: function(){
            if($(this).attr('data-select')!='true'){
              $(this).val('');
            }
          }
    });

    Посмотреть, как это работает.

    Если понадобится использование autocomplete жестко, чтобы пользователь мог выбирать только из списка, то можно добавить дополнительный обработчик change текстовому полю и удалять введенные данные, если они не были выбраны из списка:
    $( "#tags" ).change(function(){
        if($(this).attr('data-select')!='true'){
          $(this).val('');
        }
    });

    Посмотреть на работу можно тут.
    Ответ написан
    Комментировать
  • Замена и запрет символов в TextBox?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    private: System::Void aPredelText_KeyPress(System::Object^  sender, System::Windows::Forms::KeyPressEventArgs^  e) 
    {
    	// точка или запятая
    	if(e->KeyChar == '.' || e->KeyChar == ',')
    	{
    		// жесткая запятая
    		e->KeyChar = ','; 
    		// может уже имеем один разделитель
    		if (aPredelText->Text->IndexOf(',') != -1) 
    		{
    			e->Handled = true;
    			return;
    		}
    	}
    
    	// не управляющая клавиша, не число и не разделитель
    	if(!Char::IsControl(e->KeyChar) && !Char::IsDigit(e->KeyChar) && e->KeyChar != ',')
    	{
    		e->Handled = true;
    		return;
    	}
    }
    Ответ написан
    3 комментария