Задать вопрос
  • Как реализовать кроссплатформенное ПО с библиотеками для Windows/Linux?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Я с 2011 года занимаюсь совершенствованием игрового фреймворка. Весь его код написан на C++. Целевых платформ раньше было 5 (Win, MacOs, iOs, Android, Bada), теперь 4 (Bada закрылась же) с приглядом за Tizen, WinMo и, когда-нибудь, консолями.
    В общем, уровень требований к кроссплатформенности должен быть понятен. И вот как я этого добился.

    Большая часть кода написана на платформонезависимом C++. Весь платформозависимый код расщеплен на три слоя:
    - Нижний слой, общий интерфейс для всех платформ, общие поля всех платформ.
    - Средний слой, platform-specific решения и поля. Наследуется от нижнего.
    - Верхний слой, ввод platform-spcific кода во фреймворк. Наследуется от среднего слоя.

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

    На уровне файлов этот подход работает так.
    Есть в заголовках проекта папка "platform", где собраны нижние уровни расщепления, мастер-заголовок с условным подключением среднего уровня расщепления и все общие типы для платформ.
    Так же в проекте есть папки "platform.windows", "platform.macos", "platform.###", в которых реализован средний уровень расщепления и мастер-заголовки для условного подключения.
    Верхний уровень или реализуется в своей папке, если он представляет собой целую подсистему, или описывается во все той же папке "platform".
    Исходный код сгруппирован так же, но включает в себя только мастер-заголовок .

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

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

    UPD:
    Пример с файлом очень хорошо подходит благодаря своей простоте, его я даже по памяти могу выписать из своего фреймворка, но я кое-что все таки упрощу, чтобы никого не смущать и не пугать.
    spoiler
    // PlatformSpecificFile.Windows.h
    class PlatformSpecificFile
    {
    // Platform-specific interface.
    public:
    	inline ::HANDLE GetHandle() const	{ return m_handle; };
    	
    // Platform-independent interface, but platform-dependent implementation.
    public:
    	// RAII.
    	PlatformSpecificFile() = delete;
    	PlatformSpecificFile(
    		const std::string& path,
    		const OpeningMode desired_mode,
    		const AccessOptions& desired_access,
    		const SharingOptions& desired_sharing
    	);
    	
    	virtual ~PlatformSpecificFile();
    	
    	void Close();
    	void Flush();
    	
    	const size64_t GetSize() const;
    	const bool Resize( const size64_t new_size );
    	
    	const size32_t Read( NotNull<uint8_t> buffer, const size32_t buffer_size ) const;
    	const size32_t Write( NotNull<const uint8_t> buffer, const size32_t buffer_size );
    	
    	const size64_t Seek( const size64_t offset, const SeekOrientation orientation );
    	
    	inline const bool IsValid() const	{ return IsHandleValid( m_handle ); };
    	
    private:
    	::HANDLE	m_handle = INVALID_HANDLE_VALUE;
    };
    
    // PlatformSpecificFile.Android.h
    class PlatformSpecificFile
    {
    // Platform-specific interface.
    public:
    	inline int GetHandle() const	{ return m_handle; };
    	
    // Platform-independent interface, but platform-dependent implementation.
    public:
    	// RAII.
    	PlatformSpecificFile() = delete;
    	PlatformSpecificFile(
    		const std::string& path,
    		const OpeningMode desired_mode,
    		const AccessOptions& desired_access,
    		const SharingOptions& desired_sharing
    	);
    	
    	virtual ~PlatformSpecificFile();
    	
    	void Close();
    	void Flush();
    	
    	const size64_t GetSize() const;
    	const bool Resize( const size64_t new_size );
    	
    	const size32_t Read( NotNull<uint8_t> buffer, const size32_t buffer_size ) const;
    	const size32_t Write( NotNull<const uint8_t> buffer, const size32_t buffer_size );
    	
    	const size64_t Seek( const size64_t offset, const SeekOrientation orientation );
    	
    	inline const bool IsValid() const	{ return m_handle >= 0; };
    	
    private:
    	int		m_handle = -1;
    };
    
    // File.h
    class File final : public PlatformSpecificFile
    {
    public:
    	using PlatformSpecificFile::PlatformSpecificFile;
    	
    	const size64_t GetPosition() const; // Seek( 0, SeekOrientation::FromPosition );
    	
    	const bool SetPosition( const size64_t position ); // Seek( position, SeekOrientation::FromBeginning );
    	
    	const bool IsFileEnded() const; // GetPosition() == getSize();
    };


    Мастер-заголовок платформенного кода "platform.h" в зависимости от сценария сборки включает в себя один из мастер-заголовков платформозависимого кода "platform.###.h". Платформозависимый код уже включает в себя соответствующий заголовок файла "PlatformSpecificFile.###.h"
    Ответ написан
  • Заземление, можно ли без него обойтись?

    customtema
    @customtema
    arint.ru
    Любые колонки будут фонить, если ничего не подключать, кроме питания. Вход ОУ не соединен с землей, болтается пустой провод - который работает как антенна, ловя все доступные помехи.

    Это нормально.
    Ответ написан
    1 комментарий
  • Заземление, можно ли без него обойтись?

    NeiroNx
    @NeiroNx
    Программист
    Если электроника в колонках сама по себе говно - то это ничем не исправить - только заменить.
    Ответ написан
    4 комментария
  • Заземление, можно ли без него обойтись?

    Kulver_stukas
    @Kulver_stukas
    Попробуйте провести два теста:

    1) Вилку в розетку воткнуть двумя способами
    2) Если не поможет, закоротить вход (сигнальные штекеры тюльпанов на фланец балансного входа).

    и отпишите по результатам.
    Ответ написан
    2 комментария
  • Как написать email в поддержку Yandex?

    Jump
    @Jump
    Системный администратор со стажем.
    Как написать email в поддержку Yandex?
    Ничего сложного в этом нет.
    Просто Яндекс как и любая крупная компания с огромным числом пользователей старается минимизировать обращения к сотрудникам поддержки.

    Инструкция -
    1)На странице сервиса с которым возникли вопросы ищите кнопку "помощь" она располагается как правило в нижнем правом углу страницы.
    2)По этой кнопке попадаете в раздел помощи, где перечислены основные проблемы - выбираете нужную проблему и читаете возможные решения проблемы.. Вероятнее всего там вы найдете все ответы, если будете внимательны.
    Но если этого не произошло - внизу страницы с популярными решениями проблемы будет что-то вроде такой ссылочки:
    e0d70fe4007d4c06b67324967bc34740.jpg
    Нажимаете ее и появляется форма обратной связи.

    Суть в том что пока вы не пройдетесь по популярным ответам, и не прочитаете их в техподдержку вы не попадете.
    А если уж реально все просмотрели и ответа на вашу проблему нет - тогда вы найдете эту кнопку без труда.
    Ответ написан
    2 комментария
  • Как получить данные из формы и отправить их методом put в api?

    Используйте $resource
    var app = angular.module('myApp', []);
    
    app.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider){
      
      $routeProvider
        .when('/', {
          templateUrl:'template/home.html',
          controller:'UsersCtrl'
        })
        .when('/edit/:userId', {
          templateUrl:'template/edit.html',
          controller:'EditCtrl'
        })
        .otherwise({
          redirectTo: '/'
        });
    }]);
    
    // Создаем фабрику для работы с ресурсом пользователей
    app.factory('UserResource', function ($resource){
        // Возвращаем ресурс, ссылка на документацию выше
        return $resource(
          '/test/users/:action',  // роут для работы
          {id: '@id'}, // поле идентификатор
          {
            update: { // переопределим метод update
              method: 'PUT', // тип запроса
              params: {action: 'edit'} // параметр action в роуте
            },
          }
        );
      });
    
    // Контроллер списка пользователей
    app.controller('UsersCtrl', function ($scope, UserResource) {
      // запрос на список пользователей
      $scope.users = UserResource.query();
    });
    
    // Контроллер редактирования пользователя
    app.controller('EditCtrl', function ($scope, UserResource, $routeParams) {
      // Загружаем текущего пользователя по ид из роута
      $scope.user = UserResource.get({id: $routeParams.userId});
    
      // Функция сохранения пользователя, form - объект формы
      $scope.saveUser = function(form){
        // Вызываем переопределенный метод update
        UserResource.update($scope.user)
          .$promise
          // Ловим ошибки
          .catch(function(err){
            console.error(err);
          });
      };
    });


    Содержимое template/home.html
    <ul>
      <li ng-repeat="user in users"><a href="/edit/{{user.id}}">{{user.name}}</a></li>
    </ul>


    Содержимое template/edit.html
    <form class="form" name="form" ng-submit="saveUser(form)" novalidate>
      <input type="text" ng-model="user.name">
      <button class="btn btn-default" type="submit" ng-disabled="form.$invalid">Сохранить</button>
    </form>


    index.html
    <!DOCTYPE html>
    <html lang='en' ng-app='myApp'>
    <head>
      <meta charset="utf-8">
      <title>Angular App</title>
    
      <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js'></script>
      <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular-route.min.js'></script>
      <script src='app/app.js'></script>
      
    </head>
    <body>
    <ng-view></ng-view>
    </body>
    </html>


    UPD: Добавлена форма
    UPD2: Добавил комментарии
    UPD3: https://plnkr.co/edit/LTTkrd3NbSSxC7ZKw9GJ?p=preview
    Ответ написан
    2 комментария
  • Как повысить доступность (отказоустойчивость) БД имея 2 физических сервера?

    @mureevms
    с AlwaysON можно обойтись без использования СХД, или СХД нужен в любом случае?

    Можно, для AlwaysON СХД не нужен. Технология гораздо лучше костыльного (как я считаю) Faiover Cluster средсвами самого MSSQL. Рекомендую именно AlwaysON.
    Буквально на днях поднимал кластер по технологии AlwaysON. При выходе из строя одного из серверов, даже если всего два сервера в кластере, база доступна и сервис работает.
    Но есть еще ограничение, кроме Enterprise редакции MSSQL необходимо наличие AD и настроенная фича Faiover Cluster на всех хостах с MSSQL сервером. Обращаю внимание, что фича ОС Faiover Cluster и Faiover Cluster средсвами самого MSSQL разные вещи.
    Ответ написан
    5 комментариев
  • Как организовать учет финансов в redmine?

    Matvey-Kuk
    @Matvey-Kuk
    Разработчик в Cisco, CA.
    Тыкали, пробовали, ставили с десяток этих систем, в том числе редмайн. Пришли к написанию собственной.
    Ответ написан
    Комментировать
  • Изменение цвета href в Latex?

    @AVKor
    Класс moderncv сам подключает пакет hyperref. Поэтому пакет этот подключается дважды. Используйте \hypersetup. Можно в самом классе поправить, если хочется. Там вот так сделано:
    \hypersetup{
        breaklinks,
        baseurl       = http://,
        pdfborder     = 0 0 0,
        pdfpagemode   = UseNone,% do not show thumbnails or bookmarks on opening
        pdfstartpage  = 1,
        pdfcreator    = {\LaTeX{} with 'moderncv' package},
    %    pdfproducer   = {\LaTeX{}},% will/should be set automatically to the correct TeX engine used
        bookmarksopen = true,
        bookmarksdepth= 2,% to show sections and subsections
        pdfauthor     = {\@firstname{}~\@familyname{}},
        pdftitle      = {\@firstname{}~\@familyname{} -- \@title{}},
        pdfsubject    = {Resum\'{e} of \@firstname{}~\@familyname{}},
        pdfkeywords   = {\@firstname{}~\@familyname{}, curriculum vit\ae{}, resum\'{e}}}}
    Ответ написан
    5 комментариев
  • Есть ли API у zakupki.gov.ru?

    @winise
    У сайта есть api
    вот пример гет запроса и ответа JSON

    https://zakupki.gov.ru/api/mobile/proxy/917/223/pu...

    моя страница в контакте
    https://vk.com/mudrenko_vladimir
    Ответ написан
    2 комментария
  • Для чего используется каррирование (карринг) в реальных задачах?

    suguby
    @suguby
    программист, python, django, mysql, git, hg, linux
    Предположим есть функция, которая берет много параметров, а первый параметр - имя класса формы (в джанго)
    def cool_staff(form_class, inits, defaults, user, other_param):
        # много строчек кода

    и вы вдруг обнаруживаете что в вашем коде куча вызовов, у которых первый параметр одинаков.
    ...
    res = cool_staff(form_class=MainForm, inits={a:1, b:3}, defaults=[1,2,3], ...)
    ...
    res = cool_staff(form_class=MainForm, inits={a:100500, b:42}, defaults=[3,2,1], ...)
    ...

    Тогда делаете так:
    main_cool_staff = lambda **kwargs: cool_staff(form_class=MainForm, **kwargs)

    и ваши вызовы упрощаются
    ...
    res = main_cool_staff(inits={a:1, b:3}, defaults=[1,2,3], ...)
    ...
    res = main_cool_staff(inits={a:100500, b:42}, defaults=[3,2,1], ...)
    ...

    было в реальном проекте.
    UPD. Такая форма карринга не сработает для неименованных параметров
    main_cool_staff = lambda *args, **kwargs: cool_staff(form_class=MainForm, *args, **kwargs)

    поэтому используйте всегда именованные параметры, это хороший стиль.

    UPD2. Еще подсказали вариант
    import functools
    main_cool_staff = functools.partial(cool_staff, MainForm)

    работает и с неименованными параметрами. Спасибо Андрей Дугин
    Ответ написан
    6 комментариев
  • Как же работает "крестик" в Mac OS?

    @SerMelipharo
    В идеале — крестик закрывает окно, оставляет процесс. CMD+H прячет окно, но оставляет и его и процесс. Черточка сворачивает окно в док. Плюсик (OS X <10.10) разворачивает окно на текущем рабочем столе, OS X 10.10+ — разворачивает окно в новом спейсе, option+плюсик разворачивает на логический максимум (например safari на размер письменного листа на экране, мессенджеры на максимальную высоту с оптимальной шириной поля для сообщений и т. д.), но не все разработчики соблюдают гайдлайны и правильно задают эти параметры. Для выхода используется CMD+Q или соответствующая команда в AppMenu. Ещё не забывайте о магии клавиши Option — она превращает выход в принудительную выгрузку.

    То, что вам нужно — это CMD+H или AppMenu — Hide Window/Hide, т.к. иногда хотки чем-то занят (как например в фотошопе) и для него либо нет альтернативы, либо задано другое сочетание. Скриншот прикладываю.
    160c2f1d30804dcc9e38231077ed012e.png
    Ответ написан
    3 комментария
  • Как заставить Safari не тупить?

    @Tibook
    Mac user since Motorola 68030, baby!
    "Сложно ставить диагноз по телефону", но по опыту, для слабых машин помогает отключение компрессии оперативной памяти для OS X 10.9-10.10 командой терминала:
    sudo nvram boot-args="vm_compressor=1"
    (вернуть компрессию sudo nvram boot-args="vm_compressor=4")

    На MBP 15" Mid 2009 C2D 2.53GHz 8GB RAM/1TB SSHD мне удалось заметно взбодрить 10.10. Полгода полёт отличный
    Ответ написан
    6 комментариев
  • Как распарсить сайт госзакупок?

    @Aleserche
    developer
    Ответ очень запоздалый, но всё же.
    Более правильный вариант (если не самый правильный) использовать данные из открытой части сайта. Они размещаются на ftp.zakupki.gov.ru. Пароль и логин: free и free. В нем размещаются все данные xml.
    По этой ссылке находятся документы, необходимые для работы с ООС (схемы, описание и пр.)
    Ответ написан
    2 комментария
  • Reg.ru или nic.ru?

    @lnked
    Уже много лет на reg.ru и с тех. поддержкой приходилось связываться, проблем не было никогда.
    Домены дешевле чем у nic.ru
    Ответ написан
    2 комментария
  • Какие есть курсы по Ruby on Rails?

    @caution
    1) RailsTutorial.ru (ruby on rails)
    2) hasbrains.ru (ruby, ruby on rails)
    3) Agile web development with Rails 4 (ruby on rails)
    4) Rusrails.ru (ruby on rails)
    5) railscasts.com (ruby on rails)
    6) codecademy.com (ruby)
    7) codeschool.com (ruby, ruby on rails)
    И лучше поставить рядом с виндой ubuntu.
    Как вариант, под виндой использовать данный сервис nitrous.io
    Ответ написан
    1 комментарий
  • Что подарить гику, увлекающемуся электроникой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Осциллограф
    Ответ написан
    Комментировать