Страницы

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

вторник, 17 декабря 2019 г.

Отделять javascript логику от html кода

#хороший_тон #html #javascript


Вопрос больше философский, читая форумы и общаясь с людьми создалось, скажем так,
правило хорошего тона отделять логику от верстки и вешать обработчики, пример:
// хороший код
next
$('a').click(function(){ /* some */ });

// плохой код
next
function nextslide(){ /* some */ }

Так вот посмотрев исходники крупных сайтов, таких как vk, google, yandex, habrahabr,
ebay, paypall - html буквально кишит onClick, onMouseout, onMousemove или даже чем
то таким: 


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


Ответы

Ответ 1



Думаю, не в самую последнюю очередь это, как ни странно, вопрос трафика. Такой подход к оформлению кода позволяет уменьшить объём загружаемых страниц. Из той же оперы .min.js версии популярных библиотек и плагинов к ним, где вообще весь код ужат в одну строчку, ибо инструменты разработчика браузера его всё равно распарсят и красиво оформят.

Почти полное бинарное дерево

#дерево #бинарное_дерево #cpp


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

Я сделал функцию проверки дерева на то, является ли оно почти полным, но при входе
в левое поддерево, функция проверяет не всех потомков.. аналогичная проблема в правом
поддереве

bool PBDPP1 (TNode* ptree, int &cnt)
{
    if (ptree != NULL)
    {   cnt++;
        if(ptree->right != 0 && ptree->left == 0)            
            return false;
        PBDPP1(ptree->left, cnt);
        PBDPP1(ptree->right, cnt);
    }
    else return true;
}

bool PPBD(TNode *rootTree)
{
    int cnt1 = 0, cnt2 = 0;
    if(rootTree != NULL)
    {
       if(PBDPP1(rootTree->left, cnt2))
       {
          if(PBDPP1(rootTree->right, cnt1))
          {
              int res = cnt2 - cnt1;
              if(res >= 0)
                  return true;
              else
                  return false;
          }
       }
   }
   else return false;
}


Напомню, почти полным двоичным деревом называется двоичное дерево, для которого существует
такое целое число h ≥ 0, что: 


каждый лист в дереве имеет уровень h или h + 1
если узел дерева имеет правого потомка уровня h + 1, тогда все его левые потомки,
являющиеся листами, также имеют уровень h + 1.

    


Ответы

Ответ 1



Решение взято от сюда. Предлагается обходить дерево в ширину и на каждом шаге проверять условия: если найден лист то все последующие узлы также листы если узел имеет правого потомка, то он должен иметь и левого. В коде вот так примерно: bool IsAlmostComplete(TNode * root) { std::queue nodes; nodes.push(root); bool leaf_found = false; while(!nodes.empty()) { TNode * node = nodes.front(); nodes.pop(); if(leaf_found && (node->left || !node->right)) return false; // у автора true, думаю он ошибся if(!node->left && !node->right) leaf_found = true; if(node->left && !node->right) return false; if(node->left) nodes.push(node->left); if(node->right) nodes.push(node->right); } return true; }

Считаем количество пропущенных ежедневных записей за последнюю неделю.

#дата #php


Здравствуйте! Есть интересная задачка. 
Есть установленная дата, например 2014-07-02.
Есть таблица в БД posts, куда пользователь каждый день добавляет по одной записи,
и получается примерно такая табличка:
+----+----------------------------------+------------+
| id |              title               |   date     |
| 1  | Очень хороший день               | 2014-07-10 |
| 2  | Неплохой день                    | 2014-07-09 |
| 3  | Хороший день                     | 2014-07-08 |
| 4  | Могло быть и лучше               | 2014-07-07 |
| 5  | Не доделал что хотел             | 2014-07-06 |
| 6  | Забыл вчера написать             | 2014-07-05 |
| 7  | Начал следить за собой           | 2014-07-03 |
| 8  | Стартуем                         | 2014-07-02 |
+----+----------------------------------+------------+

Мне нужно вывести статистику за последнюю неделю, относительно той даты, и вывести
её юзеру, главный показатель:
var final = Пропущено записей на этой неделе - 0.
Для решения этой задачи, мне нужно получить последние 7 записей, и сравнить их с
датами последних 7 дней. Задача для юзера, не допустить чтобы var final был больше
1. Для меня задача, если больше 1 это значение, вывести сообщение соответствующее.
Я написал функцию на php, которая получает массив последних 7 дней, но дальше не
знаю как связать всё воедино:
if ( ! function_exists('get_array_seven_day'))
{
    function get_array_seven_day()
    {
        $array = array();
        for($i=1;$i<8;$i++)
        {
            $array[] = date('d.m',strtotime(date('d.m.Y H:i:s'))-60*60*24*$i);
        }
        return $array;
    }
}
    


Ответы

Ответ 1



Во-первых в таблице не хватает индификатора юзера. Еще нужен уникальный ключ на дату + юзера. Таблица выглядит так: CREATE TABLE `posts` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL DEFAULT '', `date` date NOT NULL, `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `u_date_user_id` (`date`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Во-вторых получаем одним запросом оба значения – кол-во указанных и кол-во не указаных дней SELECT COUNT(DISTINCT `date`) AS set_counts, 7 - COUNT(DISTINCT `date`) AS unset_counts FROM `posts` WHERE `date` BETWEEN CURDATE() - INTERVAL 6 DAY AND CURDATE() AND user_id = 1; В этом запросе мы выбираем последние 7 дней от текущего. Если нужно получить прошлую календарную неделю, то сначала на php высчитываем дату последнего воскресения и указываем ее в запросе вместо CURDATE(). DISTINCT добавлен на случай, если в таблице нет индекса на уникальность даты.

Повторное использование объектов

#android #java #шаблоны_проектирования


Добрый день. В моем проекте есть несколько классов, которые расширяют Fragment -
это экраны. Для подключения экрана используется следующий код:
public void showScreen(Fragment fragment){
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.main_screen_fragment, fragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

R.id.main_screen_frament - это контейнер, который используется для отображения экрана.
Для того что бы показать экран я использую следующий код: 
public class ShowMainScreen implements Command {
    @Override
    public void execute() {
        ScreenManager.getScreenManager().showScreen(new MainScreen());
    }
}

Как видно при каждом новом вызове ShowMainScreen, будет создаваться новый экземпляр
класса MainScreen. Это не верно потому что экран созданный один раз, можно без труда
использовать снова.
Как можно хранить уже созданные экраны, для повторного использования?    


Ответы

Ответ 1



Для создания единственного экземпляра класса необходимо использовать шаблон проектирования Singleton. Вот примерная реализация: public class SingletonMainScreen extends MainScreen { static private SingletonMainScreen instance; // закрываем конструктор private SingletonMainScreen () { super(); } public static SingletonMainScreen getInstance() { if (instance == null) instance = new SingletonMainScreen(); return instance; } } Если нет желания городить класс наследник, то можно сделать фабрику или фабричный метод, которые также будут контролировать количество создаваемых экземпляров класса.

Определить размерность типа int на контроллере

#c #embedded


Можно ли написать какую-нибудь функцию, чтобы узнать размерность типа int на конкретном
контроллере?
    


Ответы

Ответ 1



Вот так можно посчитать кол-во бит в байте, int CharBit() { unsigned char c = ~0U; int res = 1; for(; c >>= 1; ++res) {} return res; } а дальше (sizeof(int) * CharBit()). То есть кол-во char'ов и int'е умножить на кол-во битов в char'e равно кол-ву битов в int'e. Для x86: 4 * 8 = 32 Вот ещё: int IntBit() { int tmp = 0, res = 0; // 0xfffff... while(++res, tmp >>= 1) {} return res; }

Что использовать для разработки кросс-платформенного мобильного приложения, активно использующего сеть и БД?

#java #android #ios #кроссплатформенность #мобильные_приложения


Я программирую под Android и сейчас делаю простенькое мобильное приложение, по функционалу
напоминающее обычный мессенджер.
В этом приложении я использую клиент-серверную архитектуру. Сервер написан на Java
с расчётом на то, что будет развёрнут на Google App Engine. Нативный клиент под Android
делает HTTP запросы к серверу, а сервер посылает сообщение через Google Cloud Messaging
адресату или адресатам или отвечает на запрос объектами в JSON-формате. Кэш в СУБД
SQLite.  

И вот сейчас (когда приложеньице уже почти готово =)) я начал задумываться как же
мне портировать (хотя бы часть функционала) на другие платформы: iOS и Windows Phone.
Писать под каждую платформу своё приложение с нуля, мне кажется, будет затратным, т.к.
я раньше не программировал под iOS и Windows Phone. Пожалуйста, если вы обладаете богатым
опытом в области создания кросс-платформенных мобильных приложений, подскажите, как
можно упростить создание и поддержку таких приложений.  

Вот, что я нашёл:



Delphi XE          | Delphi, native compilation  | Delphi developers
Unity3D            | C#, UnityScript, Boo        | Game developers


Сейчас я смотрю в сторону j2objc, JUniversal и Appery.io (грубо говоря, обёртка над
PhoneGap). И у меня такой вопрос: Какой из этих продуктов наиболее подходит для моего
приложения?

В частности,


Смогу ли я использовать вместе с ними RetroFit и ActiveAndroid?
Будут ли работать Push Notifications (GCM / APN / MPNS)?


ps. Я рассматривал и отказался от Unity3D и Delphi XE, потому что, мне кажется, они
сильно увеличат размер моего небольшого приложения. Я отказался от Xamarin, потому
что я не .Net-разработчик.
    


Ответы

Ответ 1



Месяц работаю на Xamarin, пока все нравится. Если вы сторонник ООП, тогда лучшего и более охватывающего кросп. средства не найти. Сложные приложения пишутся без особых проблем, не говоря уже о простых. Компилятор работает шустро, я бы сказал не уступает оригинальной андроид студии. Очень удобна работать с отладкой и профилированием. Если же вы сторонник веб технологий то я бы смотрел в сторону кордовы.

Ответ 2



Flutter — новый инструмент от Google, позволяющий разработчикам писать кроссплатформенные мобильные приложения, которые можно запускать как на Android, так и на iOS. Ещё один плюс Flutter — он ориентирован на Material Design и предоставляет множество возможностей для работы с ним. С чего начать? YouTube - Introducing Flutter Хабрахабр - Введение и установка flutter.io - Get Started

Ответ 3



React Native — это фреймворк для разработки кроссплатформенных приложений для iOS и Android. История React Native довольно увлекательна: родившийся как внутренний проект Facebook в 2013-м, он вскоре стал одним из самых популярных фреймворков. Теперь же его код открыт и доступен на Github. React Native очень дружелюбен к разработчикам с web бэкграундом и не требует изучения языков нативной разработки под iOS и Android – learn once, write anywhere*. С чего начать? Youtube - Что такое React Native? Хабрахабр - Создаем приложение на JavaScript с помощью React Native Getting Started Guide * Выучи один раз, пиши под что угодно.

Как получить CSS из SASS?

#css #phpstorm #sass #less #webstorm


Настраиваю file watcher. Сохраняю main.sass и почему-то создается файл с данным содержимом:

write main.css
write main.css.map


А как получить CSS код через File watcher WebStorm

    


Ответы

Ответ 1



Не понял в чем именно была проблема, но теперь всё работает с данными настройками:

Ответ 2



можно не привязываться к определенной среде а использовать отдельный компилятор например http://koala-app.com/ компилит все :)