• Особенность border в сочетании с collapse в Firefox

    Недавно, при написании одного из проектов, столкнулся с проблемой отображения границ в таблицах. Никогда не думал, что могут возникнуть сложности в такой тривиальной задаче.
    В чем суть? По дефолту вокруг каждой ячейки отображается своя рамка (рисунок 1). Мне необходимо было, чтобы отображалась одна линия между двумя ячейками (рисунок 2). Для этого я таблице задал border-collapse: collapse и толщину границы 1px.
    image

    Самое интересное начинается, если стиль границы поменять с solid на dashed (рисунок 3).
    Читать дальше →
  • Будьте проще. Иногда стоит написать велосипед

    Сразу к делу. Я по большей части backend-разработчик, но выдалась задачка реализовать на сайте ленту с эффектом параллакса при прокрутке. В голове мгновенно на автомате решение — npm, bower, google в помощь и погнали. И сразу все эти fremworks, библиотеки, настройки, внедрения и так далее. Блин, мне нужен простой эффект, больше ничего, я не хочу разбираться во всех этих мануалах, тонкостях frontend-дизайна, тащить кучу библиотек из-за такой ерунды.
    Читать дальше →
  • Сравнение скорости выполнения SQL-запросов к разным БД

    Эта публикация является односторонним сравнением популярных реляционных баз данных. А именно: по времени выполнения SQL-запросов в различных БД при прочих равных условиях (тип запроса и размер таблицы).

    Заметка: если вас интересует только результат тестирования — прошу к разделу Результаты.

    image
    Читать дальше →
  • Proxy как шаблон проектирования на примере работы с куками

    Про куки


    При работе с куками частенько мы используем популярный вариант какой либо библиотеки, все они работают примерно одинаково.


    $.cookie('cookie_name', 'cookie_value'); //установка
    $.cookie('cookie_name'); //чтение
    $.cookie('cookie_name', null); //удаление
    $.cookie('cookie_name', 'cookie_value', {
        expires: 5,
        path: '/admin',
    }); //опции

    или


    cookie.set('cookie_name', optios);
    cookie.get('cookie_name');

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


    var cookies = document.cookie.split('; ');
    for (var i = 0; i < cookies.length; i++) {
    // и разбор самой куки
    }

    Каждый вызов получения куки делает кучу работы, надеюсь в вашем проекте это не так.
    Я бы хотел работать с куками как-то так, а при чтении куки брать ее из памяти.


    // прочитать
    if (cookie.id === '1') {
        //удалить
        delete cookie.id;
    }
    
    //установить новое значение
    cookie.key = '12341234';
    
    //поменяем опции
    cookie.options = {
        expires: new Date(Date.now() + 30*24*60*60*1000).toUTCString(),
        path: '/'
    };
    
    //обновить значение
    cookie.key = '43214321';

    Proxy


    В ES6 появилась возможность полного перехвата любого объекта, обращение к любому свойству объекта можно контролировать как мы это захотим, к сожалению, заполифилить для поддержки старичков возможности нет. Описание всех возможностей Proxy мы не рассмотрим, затронем только основное на мой взгляд, на примере реализации работы с куками.

    Читать дальше →
  • Мобильный мессенджер обмена мгновенными сообщениями

    Вступление


    Уважаемые Хабрахабровцы, хочу поделиться с Вами своей разработкой для OS Android.
    Данная статья ориентирована, во-первых, на новичков в андроид-разработке, во-вторых, на людей, которым интересна идея о безопасности общения по сети, в-третьих, просто на тех кому интересно.

    Суть


    Моя цель написать мессенджер, который позволил бы, в коей мере, уйти от всемирной слежки. Уйти? — спросите Вы. Да именно так я представляю себе, мое творение. Потому как общение клиента с сервером реализуется на сокетах, с применением ГОСТ-товского шифрования «МАГМА» (блочный симметричный).

    Программный комплекс (назовем его комплексом, ибо он состоит из двух модулей, написанных собственными руками) имеет в своем составе следующие компоненты: клиентская часть, написанная в AndroidStudio и серверная часть, написанная в IntelliJ IDEA. Клиентов мы распространяем доступными нам способами: передачей APK по BlueTooth, WatsApp, PlayMarket, да и вообще как душа пожелает и как удобно Вашей аудитории. Сервер запускаем на своем ПК, можно конечно и арендовать какой-нибудь сторонний сервер, все равно данные там хранить мы не будем. Клиенты регистрируются, авторизуются и готовы для массовых переписок. (в перспективе реализую и индивидуальное общение ТЕТ-А-ТЕТ, а также шифрование).

    Недоработки


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

    Хватит лирики, перейдем к кодингу


    Комментарии в коде писал для себя, поэтому думаю все будет понятно и по ним.

    Начнем с сервера:

    1. класс описания самого «ядра» сервера
    Читать дальше →
  • Неработающий сенсор закрытия крышки ноутбука и что из этого вышло

    Какое-то время назад мой рабочий ноутбук отказался включаться. Просто не реагировал ни на какие попытки, включая отключение батареи. У технической поддержки ушло несколько месяцев на то, чтобы замененить практически все компоненты от матрицы до материнской платы и выяснить, что проблема была в перетертом шлейфе матрицы. Шлейф заменили, машина ожила и вернулась ко мне. Но в первый же день выяснилась интересная особенность — видимо, в пылу борьбы со шлейфом ремонтеры поломали или отключили датчик закрытия крышки. Теперь ноутбук не засыпает при закрытии крышки. Какое-то время я пытался найти способ устранить это самостоятельно, но в этот раз действенных советов Гугл и форумы комании Lenovo, к сожалению, не дали. Второй раз отдавать машину в ремонт просто страшно.

    Ок, я не могу решить проблему механически, но может быть можно придумать, какой-то простой workaround. Например, я привык, уходя блокировать компьютер нажатием Win+L, почему бы не сделать shortcut для перевод машины в спящий режим? Выяснилось, что отправить машину в sleep несложно, но вот привязать это к нажатию на Ctrl+Q, например, уже не так тривиально. Можно найти софт, который будет управлять для вас этими функциями. Ну или написать свой. И так вышло, что как раз сегодня есть пара часов времени и стойкое желание попрактиковаться в программировании.

    Так как программист я посредственный, то писать решил на C# в Visual Studio Community Edition. Чтобы не усложнять создал пустой проект в формате Windows Form Application с одной формой, в которую добавил контрол notifyIcon. Форму сделал невидимой сразу после старта, а в обработчк MouseDoubleClick добавил код включения и выключения видимости, чтобы форму можно было штатным образом закрыть. Эта мысль пришла не сразу, а после того, как стало понятно, что приложение должно уметь отменить регистрацию глобальных shortcut-ов после своей терминации.
    Читать дальше →
  • Разработка редактора (расширение на C# для Visual Studio)

    День добрый.


    В связи с созданием большого расширяемого проекта, возникла необходимость дать разработчикам возможность собирать свои пакеты/модули под проект. (Нечто похожее на редактор Feature и WSP Package для SharePoint) Для этого необходимо создать редактор пакетов/модулей для Visual Studio. Для создания расширения под Visual Studio очень мало информации в интернете, а из официального нашел только это. Решил собрать свою библиотеку (VSExtensibilityHelper), которая бы облегчила пользователю создание VSIX дополнений. В ней собраны базовые классы для создания редакторов:


    • BaseEditorFactory — Базовый класс фабрика
    • BaseWinFormsEditorPane — Базовый класс для редактора на основе WinForms компонента
    • BaseWpfEditorPane — Базовый класс для редактора на основе WPF компонента
    Читать дальше →
  • Для чего я создал очередную библиотеку, чтобы уменьшить шаблонный код Redux.js

    Данный пост — перевод данной статьи

    Я работал над новым проектом на React и Redux. Раньше при разработке проектов на React, я работал в одиночку, но в этот раз я был частью команды, где каждый член команды имел некоторый опыт в React и Redux. Проект должен был быть выпущен в продакшн за короткое время.
    Читать дальше →
  • 8 шагов к эффективному управлению временем 

    Несмотря на то, что жизнь каждого из нас индивидуальна и неповторима, представляю вам 8 простых шагов, которые помогут большинству из вас тратить больше времени на то, что важно, и меньше — на то, что совершенно бессмысленно.

    [1] Записывайте потраченное время. Первый шаг к тому, чтобы начать эффективно использовать время, заключается в том, чтобы выяснить, сколько времени вы тратите сейчас. В течение нескольких дней, в идеале недель, записывайте все, что вы делаете, так часто, как об этом вспоминаете. Представьте, что вы юрист, который должен четко зафиксировать время, потраченное на различные проекты: работу (в различных ее проявлениях), сон, путешествия, домашние дела, общение с семьей, просмотр телевизора и так далее. Это крайне не просто, хотя и казалось бы не сложной задачей, но у меня получилось далеко не с первого раза, но когда я зафиксировала временные показатели одной недели было очень полезно смотреть куда и сколько времени было потрачено, что помогло для дальнейшей оптимизации и делегирования.

    [2] Займитесь математикой.
    После того, как вы получили исходные данные, рассчитайте время по нескольким категориям. Каковы ваши ощущения? На что вы потратили слишком много времени, а на что недостаточно? Что вам больше всего нравится в вашем расписании? Что бы вы хотели изменить? Мне удобнее всего было вести данный хронометраж в обычной таблице Excel, где желтым цветом я обозначила те дела, которые мне нравятся и вдохновляют меня. И как вы можете догадаться их было не очень много, ну а если на чистоту это всего 6 дел из 127, теперь я активно работаю над тем, чтобы неприятные дела делегировать по максимуму.
    Читать дальше →
  • Как развернуть phpPgAdmin и phpMyAdmin на Windows

    Ни одно приложение и BI система на данный момент не может существовать без базы данных, наиболее популярными по крайней мере из бесплатных СУБД являются MySQL и PostgreSQL.


    Конечно любой СУБД вполне можно управлять из командной строки без какого либо графического интерфейса, в этом есть и свои преимущества, к примеру если вы работаете с СУБД из командной строки то вам не потребуется установки какого либо дополнительного программного обеспечения для администрирования базы данных с любого ПК. Но всё же командная строка далеко не самый удобный в работе инструмент.

    Читать дальше →
  • Об IT образовании. Образование глазами студента

    Я учусь на третьем курсе одного из московских вузов, в котором абитуриентам обещают сделать из них широкопрофильных специалистов в сфере IT уже через 4 года. Хотелось бы подробнее написать, как все происходит на самом деле.

    Преподаватели


    Моя специальность называется «Информационные системы и технологии». Большинство преподавателей на нашей специальности приходят к нам из индустрии, что очень круто, потому что они действительно знают, о чем говорят. Например, сложно поверить в то, что человек научит тебя вести собственный бизнес, когда у него самого нет никакого бизнеса. У этих же людей есть опыт в той предметной области, которую мы изучаем вместе с ними.

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

    Кроме того, преподаватели часто недостаточно мотивированы, как и сами студенты. Как только некоторые из них видят, что их предмет не вызывает особого интереса у студентов, они всячески начинают развлекать их чем-то другим. Например, у меня был препод, который вел у нас предмет с необходимостью как можно больше практиковаться, но практики не было вообще… Зато были истории про его жизнь в большом количестве, совершенно не связанные с предметом. Истории вполне уместны, но не тогда, когда они занимают большую часть учебного процесса.
    Ну есть, конечно, совершенно другие преподаватели. Их легко отличить, потому что сразу видно, что им нравится учить нас и они относятся к этому, как к важной миссии, а не как к рутине. Таких у нас было 5-6 за четыре семестра (при том, что в общей сложности, было больше 20). К сожалению, классный препод до сих пор остается скорее исключением, чем правилом. Но о том, что же делает его классным, немного позже.

    Читать дальше →
  • Greedy algorithms and proof of correctness (part 1)

    Это цикл статей о том, как распознавать задачи, решаемые жадными алгоритмами, писать строгие доказательства корректности этих алгоритмов, а также о том, как распознавать задачи для которых жадные алгоритмы не применимы.

    Вступление


    О жадных алгоритмах многие знают еще со школы с университета. В любом курсе по алгоритмам выделена хотя бы одна небольшая глава посвященная жадным алгоритмам. В частности, в книге Томаса Кормена «Алгоритмы. Построение и анализ» освящается эта тема.

    В данной статье будет одна задача, для которой будет приведено строгое доказательство на почти формальном математическом языке.
    Читать дальше →
  • OSPF, RIP и BGP простым языком. Часть 1. Протокол RIP

    Введение


    На данный момент почти все люди знают, что такое интернет, но некоторые даже и приблизительно не представляют, как он работает и как за такое короткое время устройства находят друг друга. В этих статьях я решил разобрать основные протоколы маршрутизации, что они из себя представляют и как работают. Данная статья скорее для тех, кто только начал свой путь по сетям и стремится больше узнать о работе маршрутизаторов в небольших и средних локальных сетях (Для крупных чаще всего используется протокол OSPF). Первым разберем протокол RIP. Но сначала немного о маршрутизации…

    Маршрутизация


    Маршрутизация сама по себе — поиск маршрута доставки пакета между сетями через транзитные узлы — маршрутизаторы, которые позиционируют себя как многофункциональные устройства для разделения сетей. Вся сеть интернет разделена на крупные автономные системы (AS), которые связываются и узнают друг о друге с помощью внешних протоколов маршрутизации,
    Читать дальше →
  • Автоматическое переключение на резервный 3G средствами Windows

    Хочу поделиться своим опытом настройки автоматического перехода на резервный интернет 3G, когда основной пропадает, и возврата на основной, когда он заработает. Все это реализовано стандартными средствами Windows.

    Задача была — обеспечить постоянное наличие интернета на майнинг ферме. Усердное гугление ничего не дало. Интернет пропадает очень редко, потому покупать Mikrotik или другие железки желания не было.

    Имеем проводной интернет (или wi-fi) и 3G свисток.

    Вся настройка сводится к подключению 3G свистка и настройки коммутируемого подключения. Далее скрипт в .bat, который кладем в авто запуск.
    Читать дальше →
  • Вступление в архитектуру React Fiber

    Это перевод статьи Andrew Clark. Оригинальная статься здесь.


    Вступление


    React Fiber — прогрессивная реализация ключевого алгоритма React. Это кульминационное достижение двухгодичных исследований команды разработчиков React.


    Цель Fiber в увеличении производительности при разработке таких задач как анимация, организация элементов на странице и движение элементов. Ее главная особенность это инкрементный рендеринг: способность разделять работу рендера на единицы и распределять их между множественными фреймами.


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

    Читать дальше →
  • Предложение от ИТ сообщества к властям Российской Федерации

    Регулирование интернета властями неизбежно — мы считаем необходимым помочь властям это сделать правильно.
    Потому, что на данный момент квалификации и компетенции чиновников, регулирующих интернет недостаточно для принятия общественно безопасных законов.
    Читать дальше →
  • Простой бот Telegram на Java с нуля

    Привет, читатель.

    Важно для прочтения!
    Если ты не против, то изучи ООП и Jav'y прежде, чем учить другие библиотеки. Ибо ты не будешь браться за физику, не выучив математику. Тут то же самое.

    Сегодня мы будем писать простейшего бота Telegram, который будет отвечать на команды. Такая статья была, но писали бота на Питоне.

    Почему я выбрал именно Jav'y
    Java в плане ботов, серверов, плагинов да и вообще программ будет удобнее для меня.

    1. Виртуальная машина хоть и долгая, но если обрабатывать события в несколько потоков, то будет работать быстро.(Вообще для многих серверов/мультиплеерных игр в одном потоке не всегда получится обрабатывать события, в Jav'e сделать это гораздо проще)

    2. Наличие хорошей документации и Javadoc'ов, которые можно сделать для всех библиотек(не только для системных)

    0. А что такое «бот»?

    Бот — это профиль в соцсети/мессенджере(в данном случае Telegram) который отвечает на команды.( В любом случае все действия буду происходить после выполнения команды)

    Тип чата с ботом — это переписка 1 на 1.

    1.С чего же начинать?

    Здесь качать библиотеку Telegram(обязательно with-dependiciens)

    IDE можно выбрать любую, я бы порекомендовал eclipse.

    Импотрируем библиотеку Телеграма и приступаем.
    Читать дальше →
  • Передача массива в функцию, подсчет длины массива по указателю

    В С++ существует несколько возможностей передачи массива в функцию.


    1. В С++ массивы можно инициализировать следующим образом:

      int arr[] = {p1, p2, p3, ...}; // длина массива определяется 
      после инициализации

      Как следствие, его можно передать в функцию таким же способом:

      void func(int arr[]){
      //your code
      }
    2. Еще один вариант — передать массив по указателю. Например:

      void func(int* arr){
      //your code
      }
      int arr[5] = {1, 2, 3, 4, 5};

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

      int main(){ 
         int arr[5] = {1, 2, 3, 4, 5};
         cout << arr << endl; //в данном случае мы увидим адрес начала массива 
          return 0; //его мы и передаем в массив
      }

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

    void func(int* arr, int length){
    //your code
    }

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

    int len(int* arr){
        int count = 0;
        while(*x++ < ?) count++;
        return count;
    }
    

    Крайне важно понять критерий по которому мы будем оценивать содержимое. В противном случае, можно получить не совсем то, что ожидалось.
    Читать дальше →
  • Криптовалюта и интернет-магазин. История подлючения и немного 54-ФЗ

    Здравствуйте, дорогие хабрачитатели!

    Появилась недавно задача подключить к одному интернет-магазину оплату криптовалютой. Причем не только популярными биткоинами, но и такими валютами, о которых мне раньше и слышать не приходилось. Реализовывать полноценный функционал взаимодействия с каждой криптовалютой отдельно, задача не из простых. Если для того же биткоина есть библиотеки, позволяющие начать работу практически из коробки (но без допиливания и танцев с бубном, как показывает практика, не обходится), то, например, для dogecoin нужно писать все с нуля. Так как данный вид оплаты для сайта не предполагался как основной, а скорее как фишка для рекламы и раскрутки, то и бюджет не предполагал крупной разработки.
    Читать дальше →
  • Экономим трафик в SPA

    Основная задача одностраничных приложений (SPA) – это коммуникация с сервером, а зачастую и с многочисленными серверами по средствам XHR. Но большинство данных достаточно загрузить один раз. Как это сделать красиво? Способов много. Однако, мы рассмотрим только один, с помощью обещаний Promises.
    Читать дальше →