Страницы

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

Показаны сообщения с ярлыком кроссплатформенность. Показать все сообщения
Показаны сообщения с ярлыком кроссплатформенность. Показать все сообщения

понедельник, 24 февраля 2020 г.

Кроссплатформенность битовых операций

#cpp #битовые_операции #кроссплатформенность


Как добиться кроссплатформенности при сериализации, работе напрямую с битами, составления
пакетов для отправки между классами при условии, что битовые манипуляции должны быть
верны при little endian и big endian.
    


Ответы

Ответ 1



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

Ответ 2



В полях структур, используемых для обмена, храните данные в сетевом формате (network order, подробнее можете посмотреть здесь). Для преобразования данных между сетевым форматом и форматом хоста можно использовать функции htons()/htonl()/ntohs()/ntohl() из Berkeley sockets API.

Ответ 3



Внутри байта биты всегда идут слева направо от старшего к младшему, независимо от принятого порядка байтов в системе. То же самое касается операндов у операторов >> <<, даже если это числа, состоящие из больше чем 1-го байта. То есть int i=4; i>>=1; i всегда будет равно 2. Для кроссплатформенной (де)сериализации можно использовать htons()/htonl()/ntohs()/ntohl()

воскресенье, 26 января 2020 г.

Какие языки программирования хороши для создания кросс-платформенных desktop приложений? [закрыт]

#кроссплатформенность #desktop


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Смотрел Java. В x64 системе окошко с хелловорлдом отъедает около 20 МБ памяти, и
это число быстро растёт при создании новых объектов. Mono - достаточно посмотреть на
плеер Banshee чтобы понять что там ситуация не лучше (Музыкальный плеер отъедает ~
100 МБ памяти, при том что я всегда держу загруженный плеер мне это не нравится).
С++/Qt кажется неплохо, но на изучение придётся потратить большое кол-во усилий,
при том что не известно оправдаются ли(Вообще у Qt сейчас как я вижу не самая стабильная
ситуация, да и с плюсами в новых проектах люди стали поосторожнее)
Python/PyGTK оказался на удивление более скромным к памяти чем java, но сам язык
кажется мне каким-то невменяемым, возможно я просто не понимаю динамичскую типизацию.
Отсутствие инкапсуляции и перегрузки функций удивляет. Непонятно какое значение возвращает
какая-либо функция. Код показался не читаемым как раз из-за отсутствия скобок. Где-то
наткнулся на совет реже использовать вызовы функций, особенно в циклах т.к. это дорогая
операция в питоне. Перед глазами сразу представились огромные методы в 200+ строк.
PS Возможно я в чём-то не прав т.к. посмотрел на эти языки весьма поверхностно. Кросс-платформенность
на уровне компиляции вполне устроила бы(с неизменным кодом).    


Ответы

Ответ 1



Что лучше зависит от критериев выбора. В данном случае они такие: Время разработки и время внесения изменений (причем второе может быть важней первого для заказных приложений). Сложность приложения. Тип приложения("фотошоп", "WoW" или "клиент к твиттеру"), тиражное или заказное. С++ скорость разработки самая низкая для сложных приложений для тиражных решений требующих высокой оптимизации выполнения. Для слабого железа - GPS навигаторы, банкоматы, станки с ЧПУ, ... Java время разработки меньше чем у C++. Особенно время внесения изменений, доработок для сложных приложений когда требуется эффективность выполнения программы (перерасход памяти беспокоит только молодых программистов. Ни производителей смартфонов на Android, ни заказчиков бизнес софта это свойство JVM не волнуют. И мою жену тоже не волнует сколько отъедает музыкальный плеер), и при этом не требуется оптимизация выполнения с помощью низкоуровневых трюков или специфики ОС. Python время разработки самое низкое для простой и средней сложности приложений (для сложных - только при высокой квалификации программистов или формализованного процесса разработки) для некритичных к времени выполнения(примеры - клиент Dropbox'а, wikidpad). Для заказных, малотиражных приложений. (программы на серверах гугла и яндекса - "заказные", потому что уникальны) О времени разработки молодые программисты обычно не задумываются. А частенько в жизни - побеждает не лучшее, а - первое. Особенно при работе под заказ. О динамической типизации. Она требует самодисциплины разработки, чего обычно нет у молодых программистов, и они сами себе "злые буратины" быстро превращающие код в полный хаос. Она требует обязательного и сурового применения TDD или подобных методик. Интерпретатор/компилятор ЯП с динамической типизацией никогда не сможет выполнять/генерировать код той же эффективности выполнения что с статической типизацией. К вопросу - нравится/не нравится какой-то язык программирования. Во-первых, часто "не нравится" это - "не знал, не знаю, и знать не хочу" Во-вторых, когда после нескольких законченных и работающих программ остается "не нравится" то действительно стоит подумать о смене языка программирования. Разработка на любимом языке программирования - очень важный мотиватор для уменьшения времени разработки и улучшении ее качества. (О себе - профессионально(то есть за деньги) писал на plain С, Java, Python)

Ответ 2



Отвечу про Python. Отсутствие инкапсуляции и перегрузки функций удивляет. Инкапсуляция в питоне, хоть и весьма условная, но есть. Если метод начинается с __, то интерпретатор автоматически добавляет к имени префикс _%current_class% и, соответственно, в другом классе такой метод уже не будет виден. Private Methods: """ >>> obj = bar() >>> obj.__test() Traceback (most recent call last): ... AttributeError: 'bar' object has no attribute '__test' >>> obj.test2() Traceback (most recent call last): ... AttributeError: 'super' object has no attribute '_bar__test' >>> obj._foo__test() Hello >>> obj._foo__test > """ import doctest class foo(): def __test(self): print('Hello') class bar(foo): def test2(self): super().__test() doctest.testmod(optionflags=doctest.ELLIPSIS) Таким образом достигается инкапсуляция атрибутов класса. Конечно-же, все еще можно обратится к такому методу по полному имени. Однако, для примера, и в C# можно обратиться к приватным методам через рефлексию, но это вовсе не значит, что эти методы публичные. Для создания абстрактных классов используется специальный метакласс c декораторами. """ >>> obj = bar() >>> obj.test() Hello >>> obj = baz() Traceback (most recent call last): ... TypeError: Can't instantiate abstract class baz with abstract methods test """ import abc import doctest class foo(metaclass=abc.ABCMeta): @abc.abstractmethod def test(self): print('Hello') class bar(foo): def test(self): super().test() class baz(foo): pass doctest.testmod() Аналогичным образом реализуются и интерфейсы. Что-же касается перегрузок функций, то в динамическом языке, где методы могут принимать переменное число параметров и значения по умолчанию - это не возможно, да и совершенно не нужно. Пример: """ >>> foo(1, 2, 3, 4, 5, arg1=1, arg2=2, bar=False) (1, 2, (3, 4, 5), False, {'arg1': 1, 'arg2': 2}) """ import doctest def foo(first, second, *args, bar=True, **kwargs): print( (first, second, args, bar, kwargs) ) doctest.testmod() Непонятно какое значение возвращает какая-либо функция Да, этот недостаток присущ, наверное, всем динамическим языкам. Однако, в оправдание питона могу сказать, что эта проблема частично решается при помощи аннотаций, полноценного IDE и хорошего документирования функций. Более того, при помощи аннотаций, метаклассов и декораторов не сложно реализовать и статическую типизацию :) Т.е. примерно следующее: """ >>> foo().bar([1, 2, 3]) Traceback (most recent call last): ... TypeError: 'param' is 'list', but the expected type is 'int' >>> foo().bar(1) Traceback (most recent call last): ... TypeError: function return is 'str', but the expected type is 'bool' """ class foo(metaclass=StrongTyping): def bar(param: int) -> bool: return 'some text' Разумеется, что бы пример работал, нужно еще реализовать метакласс StrongTyping. Код показался не читаемым как раз из-за отсутствия скобок. Вероятно, это дело привычки. Отсутствие скобок обязывает программиста следить за отступами и использовать единый символ табуляции, что уже, на мой взгляд, не мало. Что же касается визуального разделения методов, то тут помогаю IDE, которые отделяют их горизонтальными линиями. Где-то наткнулся на совет реже использовать вызовы функций, особенно в циклах т.к. это дорогая операция в питоне. Перед глазами сразу представились огромные методы в 200+ строк. На мой взгляд, гибкость питона и такие возможности, как генераторы выражений наоборот позволяют писать очень компактные и лаконичные конструкции. Там где для строго-типизированных языков требуются куча циклов и условных конструкций, в питоне решается одной строчкой. UPD. Какие преимущества у динамической типизации? Имхо, именно в динамичности. Где еще можно написать нечто подобное: """ >>> op = ImportantClass() >>> op.foo(1) >>> ImportantClass.debug(True) >>> op.foo(2) Called (<__main__.ImportantClass object at 0x...>, 2) {} None """ import doctest import functools def logging(func): """ Декоратор функции, который логирует все вызовы """ @functools.wraps(func) def wrapper(*args, **kwargs): ret = func(*args, **kwargs) print('Called ', func, args, kwargs, ret) return ret # одна из особенностей питона - это то, что все является объектами # добавляем атрибут к функции wrapper.original = func return wrapper def debugging(cls): """ Декоратор класса, добавляет метод debug(enable) """ @classmethod def debug(cls, enable=True): attr = '__call__' if enable else 'original' call = lambda f: logging(f) if enable else f.original # в цикле подменяются все функции на logging(f), либо на оригинальные, # которые хранятся в декораторе for func in [call(f) for f in cls.__dict__.values() if hasattr(f, attr)]: setattr(cls, func.__name__, func) # добавляем новый метод для декорируемого класс # именно для класса, декоратор вызывается только один раз cls.debug = debug return cls @debugging class ImportantClass(): def foo(self, *args, **kwargs): pass # do something important def bar(self, *args, **kwargs): pass # also do something doctest.testmod(optionflags=doctest.ELLIPSIS) Декораторы logging и debugging можно вынести в отдельный модуль и применять для любых классов. При этом при выключенной отладке накладных расходов практически не будет, т.к. методы именно заменяеются другими методоми, а не оборачиваются. С другой стороны именно эта динамичность может служить источником ошибок, по этому приходится использовать ее осторожно и не забывать про тестирование. Кстати,на самом деле считается, что питон имеет одновременно и строгую, и динамическую типизацию. Т.н. код "1" + 1 выбросит исключение TypeError.

Ответ 3



Qt сама по себе не так сложна, если знакомы с С++. Зато возможности мощнейшие. Кросплатформенность тотальная! Ценю Qt еще и за то, что компоновка внешнего вида объектов происходит почти автоматом - не получается аляпистых кривых окон (как это часто любят делать программеры делфи). Для любой ОС внешний вид приложения будет идентичен - можно не опасаясь писать под виндой приложение которое будет потом скомпилировано и под Linux, и оно будет выглядеть одинаково и там и там. Мощнейший набор классов на все случаи жизни - мультимедиа, графика, текстовые редакторы, базы данных и т.д. Стабильность и поддержка очень крупной компанией. Регулярные релизы. Наличие свободной версии и версии для мобильных устройств. Сложность изучения языка и самого набора библиотек окупается многократно.

Ответ 4



Свой сверхвысокоуровневый DSL (Domain Specific Language, заточенный под ваши задачи) + автогенерация кода для (полусотни) целевых платформ х (PC *2 /win,lin/ *2 (x32,x64), Mac, Android *2 /4.x, backport-затычки 2.x/, iPhone, смарт-часы, облака х количество СУБД/хранилищ данных каждая со своими заморочками х Java, С#, JavaScript и еще десяток ходовых ЯП потому что понадобилась какая-то уникальная библиотека или работа приложения в специфическом окружении, или заказчик ограничил т.к. у него есть спецы для поддержки знающие что-то одно. По универсальности/эффективности и доступности вотпрямщщас: связка Python и С++, и нативные библиотеки GUI, интерфейса к БД итд, завернутые в классы с одним интерфейсом (для каждого вида -- GUI, БД,..).

Почему существует Qt?

#qt #кроссплатформенность #qt_faq


Уже давно существуют виртуальные машины (платформы) вроде Java или того же .NET,
которые поддерживают достаточно большое количество аппаратных архитектур, и имеют реализации
на самых различных исполняемых средах (включая Embedded).

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

В чем сенс?   

Немного информации к размышлению - Why aren't more desktop apps written with Qt? [closed]
    


Ответы

Ответ 1



Qt был и есть и скорее всего будет, потому что еще есть такие странные люди, которые пишут программы на С++ (представляете себе! и это в 21 веке!) и пишут не без успеха. В том числе и программы с GUI. А Qt делает это и еще много других манипуляций с С++ просто удовольствием. Кроме того, как было замечено, он очень удачно дополняет стандартную библиотеку С++. А писать на С++ будут еще очень долго, потому что есть масса задач, где он (и подобные низкоуровневые языки) не заменим ни джвой, ни шарпом. По поводу VM. На джаве на настоящий момент (насколько я знаю, могу ошибаться) самый прогрессивный стандартный способ создания GUI - Swing. Работа с ней до крайности гемморойная, сама тяжелая, а интерфейсы выглядят динозаврами. Поэтому GUI на ней пишутся еще реже, чем на Qt. .Net - очень плотно завязана на винду. Хотя есть Mono, но создание GUI на ней под никсы (насколько помню) отличается от винды, поскольку используется GTK+ => пропадает переносимость. Да и под линями на моно программ совсем мало. Не пошло оно там. Есть масса привязок Qt к разным языкам, самая качественная - к Питону. Но есть и к той же джаве (хотя и не полная). Так что Qt - это класс. И еще: не забывайте про KDE !

Ответ 2



Qt появился раньше, чем появился .net. Qt - это фреймворк для С++. Программы, написанные на С++ работают быстрее, чем аналоги на java. .NET - это фреймворк для C# Qt - это фреймворк для C++

Ответ 3



ну хотя бы потому что это зрелый качественный продукт для кросс-платформенной разработки с обширной документацией, сформировавшимся сообществом. Плюс к тому открытый код, широкие возможности для разработки визуальных интерфейсов, ну и бесплатность опять же. .NET в отличие от сабжа - не кроссплатформенный продут, да и появился лет на пять позже Qt, как было справедливо замечено выше. Кроме того нужно учитывать, что в отличие от Java и C#, чьи стандартные библиотеки имеют широчайшие наборы классов на все случаи жизни, С++ этим похвастаться не может, что не без успеха способен исправить Qt. З.Ы. Вероятно, сам факт его существования доставляет вам какие-то неудобства?

Ответ 4



Я бы помимо всего еще не забывал, что программирование как таковое существует дольше чем java с C#, а значит на более старых языках уже скопилось очень много наработок (алгоритмов, бизнеслогики, да и просто готовых программ), которые в случае перехода массово на более новые языки придется либо выкидывать и переписывать с нуля, либо делать какую-то прослойку, которая тоже будет дополнительно замедлять работу и вносить свою специфику.

воскресенье, 12 января 2020 г.

Кросплатформенный код на C, теоретические проблемы

#c #кроссплатформенность


Понимаю что вопрос дурацкий, но тем не менее :) В каких случаях неверно утверждение:
"если код на pure C, использующий только стандартные библиотеки, собирается и работает
под linux-32, linux-64 и win-32, то он без дополнительных мер соберётся и корректно
заработает под win64"?

В принципе ответ очевиден: например, в тех случаях, где есть завязка на разрядность,
совмещённая с "ифдеф виндовс". Но есть практические примеры не таких очевидных вещей?
    


Ответы

Ответ 1



Как уже было сказано выше, многое зависит не только от платформы, но и от компилятора - часто именно от компилятора. Для разрешения ситуаций с размерами и разрядностью иногда создаются внутренние типы, фактический смысл которых зависит от платформы. Так например у Apple CGFloat в 32-битной системе это float, а в 64-битной - double. Для пущей совместимости могу посоветовать собирать проект одним и тем же компилятором на разных платформах.

Ответ 2



Ну, например вы используете тип long, который имеет разный размер на разных платформах, и приводите его к другому типу (к указателю) OS arch size Windows IA-32 4 bytes Windows Intel 64 4 bytes Windows IA-64 4 bytes Linux IA-32 4 bytes Linux Intel 64 8 bytes Linux IA-64 8 bytes Mac OS X IA-32 4 bytes Mac OS X Intel 64 8 bytes Visual C, Win32: sizeof(char)=1 sizeof(wchar_t)=2 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(long long)=8 sizeof(void*)=4 sizeof(size_t)=4 Visual C, Win64: sizeof(char)=1 sizeof(wchar_t)=2 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(long long)=8 sizeof(void*)=8 sizeof(size_t)=8 GCC on 32 platform: sizeof(char)=1 sizeof(wchar_t)=4 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(long long)=8 sizeof(void*)=4 sizeof(size_t)=4 GCC on 64 platform: sizeof(char)=1 sizeof(wchar_t)=4 sizeof(short)=2 sizeof(int)=4 sizeof(long)=8 sizeof(long long)=8 sizeof(void*)=8 sizeof(size_t)=8

Ответ 3



Довольно часто код полагается на undefined behaviour, и таким образом зависит от конкретной реализации компилятора. Популярной ошибкой является вызов метода, не использующего локальные переменные, по NULL-указателю. Это может сработать на некоторых платформах, но по стандарту это имеет право привести к чему угодно. То же относится к переполнению знакового целого. GNU toolchain под интеловской платформой доопределяет поведение в этом случае, но другие компиляторы — нет. Более тонкая ошибка: чтение неинициализированной переменной есть UB по стандарту. Очень многие забывают это, считая, что она будет содержать «какое-то там значение», и ничего страшного в обращении к ней нет. Однако, на платформе IA64 (Itanium) это может привести к крешу.

суббота, 11 января 2020 г.

Что означают значения атрибута os.name?

#python #python_3x #os #кроссплатформенность


Разбираюсь с модулем os. В атрибуте os.name лежит одно из значений: posix, nt, os2,
ce, java, riscos. 

Posix, nt, os2, rscos - это понятно. Что значат остальные, java и ce? 

В доках не нашел объяснение
    


Ответы

Ответ 1



Существует много различных реализаций Python. Главной из которых является CPython. С ней также совместимы: IronPython, Jython и PyPy. в CPython в качестве значения атрибута os.name поддерживаются: posix nt IronPython: posix nt ce - Windows CE Jython: posix nt os2 ce - Windows CE riscos - RISC OS ibmi - IBM java - Jython PyPy: posix nt os2 ce - Windows CE riscos - RISC OS

пятница, 27 декабря 2019 г.

Как узнать, с какого дня начинается неделя для текущей локали системы?

#c #дата #кроссплатформенность #локаль


Требуется вывести в консоль календарь на месяц, для чего необходимо знать день, с
которого начинается неделя. В С в структуре времени по умолчанию день недели хранится
в формате 0-6, где 0 = воскресенье. Интересует независимость от платформы для данного
приложения. Как корректно получить системную локаль и узнать первый день недели для нее?
Возможно есть сторонняя кроссплатформенная библиотека или же придется делать под
API разных систем?
Сделать нужно на чистом С.    


Ответы

Ответ 1



Узнать название текущей локали - setlocale(LC_ALL,NULL);. Вместо LC_ALL Вам может быть лучше взять LC_TIME. Environment's default locale - setlocale(LC_ALL,""); Параметры текущкй локали - struct lconv *curloc = localeconv();. Подробности в locale.h По идее Вам надо вызвать setlocale(LC_TIME,""); и использовать localtime(), но в реальной жизни проблема в том, что локаль часто новрмально не настроена.

Ответ 2



Вот дурь, честное слово. Я тут провел маленькое исследование и выяснил, что нужно тогда поддерживать возможность указать ЛЮБОЕ начало недели. Например, в некоторых странах неделю начинают с субботы (!). Так сделано у арабов. Но они и пишут своей вязью справа налево, да? А завтра в какой-нибудь Камбодже примут стандарт, что будут считать недели со среды и что тогда делать!? по вопросу - в Си (голом) я не нашел возможности узнать с какого дня начинается неделя, да и нужно ли это действительно? Может проще сделать по-другому? Например, просто занести в конфигурационный файл программы возможность изменения этой опции или автодетект по типу локали (US -> начинаем с ВС, RU -> начинаем с ПН). Я даже табличку соответствий по странам нашел: И самое главное - проверить в какой стране (локали) мы находимся можно через переменную окружения LANG. А ее можно вычитать через extern char * *__environ; Либо использовать ф-цию getenv()

Ответ 3



Очень интересный вопрос, на который, признаться, с ходу ответа не имел. Поиск дал решение для POSIX-систем, основанное на применении фукнции nl_langinfo: пост форума источника, man. Сейчас на работе, вечером попробую проверить на работоспособность.

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

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

#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 * Выучи один раз, пиши под что угодно.

воскресенье, 1 декабря 2019 г.

Технически правильная кроссплатформенная организация хранения пользовательских файлов в Java-приложениях

#java #spring #кроссплатформенность


Как Вы знаете, в Windows файлы пользователя для большинства приложений хранятся в
AppData/Roaming. У меня почти не опыта работы с MacOS и Linux, но думаю, там есть аналогичные
папки.

Это относится не только к разработке Java-приложений, но полагаю, что как только
мы запускаем приложение, первым делом оно должно проверять AppData/Roaming на наличие
там своей подпапки и если её нет - создавать её. 

Вопрос такой: есть ли что-нибудь получше, чем приведённый ниже алгоритм?


Узнаём ОС
Получаем в зависимости от ОС путь к папке пользовательскими настройками (AppData/Roaming
в случае Windows)
Проверяем, если ли подпапка конкретно того приложения которое мы разрабатываем. Если
есть - проверяем, есть ли права доступа к ней. Если нет - создаём.
Работаем с файлами подпапки.


Может быть, есть какая-нибудь подходящая библиотека от Spring? 
    


Ответы

Ответ 1



В моем случае приложение пишет в подпапку Tomcat aplication server поскольку оно одно. Алгоритм аналогичен вашему. private static final String NIX_ROOT_FOLDER = "/opt/tomcat"; private static final String WIN_ROOT_FOLDER = "C:\\Users\\%username%\\AppData\\Roaming\\tomcat"; private static final String OS_NAME = System.getProperty("os.name").toLowerCase(); public static final String ROOT_FOLDER = OS_NAME.contains("win") ? WIN_ROOT_FOLDER : NIX_ROOT_FOLDER; Ничего плохого в таком алгоритме не вижу. В общем случае имеет смысл писать в одну из следующих папок: В папку приложения (только до передеплоя) В папку пользователя В папку сервера приложений Если планируется дальнейшая обработка этих файлов в других приложениях, то: В какую-либо выделенную папку на локальной машине В сетевую папку Spring, на сколько я знаю дает только обертку для стандартных джавовских алгоритмов работы с файлами..

Ответ 2



Расскажу про мой тяжелый случай... Искренне надеюсь что это вам никогда не пригодится По специфике работы приходится иметь дело с МСВС 5 (мобильная система вооруженных сил), это такой RedHat linux на ядре 2.6, в ней помимо всего прочего реализована мандатное управление доступом. Так вот, в таком окружении директория, в которую приложению позволено записывать файлы определяется именем пользователя, от которого запущен процесс и текущим уровнем доступа (особой важности/сов. секретно/секретно/не секретно), соответственно выглядит это примерно так: /home/%username%/.tmp/0-0/ не секретно /home/%username%/.tmp/1-0/ секретно /home/%username%/.tmp/2-0/ сов. секретно /home/%username%/.tmp/3-0/ особой важности Хорошим тоном в данном случае считается что приложение, никуда кроме как в папку пользователя не пишет, однако это возможно. А для того чтобы получить уровень доступа в Java естественно никаких средств нет, и тут у вас либо JNI либо JNA или Runtime.exec(), при помощи которых нужно выяснить метку секретности процесса Отвечая на Ваш вопрос: по сути это ваш алгоритм, только с перламутровыми пуговицами... ADD: так как топикстартер принял ответ, который может ввести людей а заблуждение, добавлю в свой ответ В общем случае веб приложение не должно писать в папку, принадлежащую контейнеру сервлетов. Во-первых это сложно поддерживать при масштабировании на несколько контейнеров, во вторых таким образом вы можете повлиять на целостность других приложений в этом контейнере. В третьих, при правильной организации установки по, томкат это один пакет а ваше приложение - другой, с вашим сценарием будет намного сложнее создать корректные скрипты для инсталляции деинсталляции. Это навскидку, то с чем реально сталкивался...

среда, 8 мая 2019 г.

Кроссплатформенность битовых операций

Как добиться кроссплатформенности при сериализации, работе напрямую с битами, составления пакетов для отправки между классами при условии, что битовые манипуляции должны быть верны при little endian и big endian


Ответ

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

пятница, 22 марта 2019 г.

Почему существует Qt?

Уже давно существуют виртуальные машины (платформы) вроде Java или того же .NET, которые поддерживают достаточно большое количество аппаратных архитектур, и имеют реализации на самых различных исполняемых средах (включая Embedded).
Почему же тогда появляются программные продукты вроде того же QT, в которые вбухивается куча труда и денег, просто чтобы заставить запускаться программы на разных платформах?
В чем сенс?
Немного информации к размышлению - Why aren't more desktop apps written with Qt? [closed]


Ответ

Qt был и есть и скорее всего будет, потому что еще есть такие странные люди, которые пишут программы на С++ (представляете себе! и это в 21 веке!) и пишут не без успеха. В том числе и программы с GUI. А Qt делает это и еще много других манипуляций с С++ просто удовольствием. Кроме того, как было замечено, он очень удачно дополняет стандартную библиотеку С++. А писать на С++ будут еще очень долго, потому что есть масса задач, где он (и подобные низкоуровневые языки) не заменим ни джвой, ни шарпом. По поводу VM. На джаве на настоящий момент (насколько я знаю, могу ошибаться) самый прогрессивный стандартный способ создания GUI - Swing. Работа с ней до крайности гемморойная, сама тяжелая, а интерфейсы выглядят динозаврами. Поэтому GUI на ней пишутся еще реже, чем на Qt. .Net - очень плотно завязана на винду. Хотя есть Mono, но создание GUI на ней под никсы (насколько помню) отличается от винды, поскольку используется GTK+ => пропадает переносимость. Да и под линями на моно программ совсем мало. Не пошло оно там. Есть масса привязок Qt к разным языкам, самая качественная - к Питону. Но есть и к той же джаве (хотя и не полная). Так что Qt - это класс. И еще: не забывайте про KDE !

суббота, 9 марта 2019 г.

Кросплатформенный код на C, теоретические проблемы

Понимаю что вопрос дурацкий, но тем не менее :) В каких случаях неверно утверждение: "если код на pure C, использующий только стандартные библиотеки, собирается и работает под linux-32, linux-64 и win-32, то он без дополнительных мер соберётся и корректно заработает под win64"?
В принципе ответ очевиден: например, в тех случаях, где есть завязка на разрядность, совмещённая с "ифдеф виндовс". Но есть практические примеры не таких очевидных вещей?


Ответ

Как уже было сказано выше, многое зависит не только от платформы, но и от компилятора - часто именно от компилятора.
Для разрешения ситуаций с размерами и разрядностью иногда создаются внутренние типы, фактический смысл которых зависит от платформы. Так например у Apple CGFloat в 32-битной системе это float, а в 64-битной - double.
Для пущей совместимости могу посоветовать собирать проект одним и тем же компилятором на разных платформах.

четверг, 4 октября 2018 г.

Платформа java - что это

Есть язык Java. Это просто синтаксис.
Есть реализация языка - это компилятор, который понимает синтаксис языка и переводит его в байт-код.
Есть Java Virtual Machine - это интерпретатор, исполняет байт-код. Насколько я понимаю, java поэтому и кроссплатформеная, потому что на каждую операционную систему создается своя JVM, которая умеет транслировать байт-код под данную ОС.
Есть Java Development Kit, которая состоит из: компилятора java, JVM, и стандартных классов и библиотек Java, используемых при разработке. JDK - это для разработчика.
Есть Java Runtime Environment - это среда выполнения Java.
А что означает "платформа Java"? Каким образом другие языки вроде Scala могут выполняться на платформе Java? Разве другие языки не компилируются в машинный код, который должен выполняться уже операционной системой? Что означает "Среда выполнения Java" JRE? Это и есть то что мы называем Java Virtual Machine? Если JVM и JRE это не одно и то же, то в чем различия?


Ответ

Платформа Java - совокупность того, что вы описали. Это довольно абстрактный термин и в разном контексте он может трактоваться по разному. Иногда просто JRE, иногда все вместе даже с сервером приложений Java EE Другие языки на платформе Java могут исполняться многими путями. Как вы верно подметили, виртуальная машина Java исполняет байт код. Таким образом любой язык, компилятор которого сможет сгенерировать валидный байт-код, может быть исполняем на виртуальной машине Java. Насколько я знаю конкретно в случае со Scala все немного проще и используется механизм обобщения (дженериков) и свойство их стирания во время исполнения. В моем понимании, выражаясь терминами языка Java - JRE - это интерфейс, а JVM - это имплементация. JVM - немного шире, т.к. может включать некоторые криптографические возможности, оптимизации, компиляцию в нативный код и т.п., напрямую не обязательные для исполнения кода и его работоспособности, но сильно увеличивающие эффективность работы программы.

Платформа java - что это

Есть язык Java. Это просто синтаксис.
Есть реализация языка - это компилятор, который понимает синтаксис языка и переводит его в байт-код.
Есть Java Virtual Machine - это интерпретатор, исполняет байт-код. Насколько я понимаю, java поэтому и кроссплатформеная, потому что на каждую операционную систему создается своя JVM, которая умеет транслировать байт-код под данную ОС.
Есть Java Development Kit, которая состоит из: компилятора java, JVM, и стандартных классов и библиотек Java, используемых при разработке. JDK - это для разработчика.
Есть Java Runtime Environment - это среда выполнения Java.
А что означает "платформа Java"? Каким образом другие языки вроде Scala могут выполняться на платформе Java? Разве другие языки не компилируются в машинный код, который должен выполняться уже операционной системой? Что означает "Среда выполнения Java" JRE? Это и есть то что мы называем Java Virtual Machine? Если JVM и JRE это не одно и то же, то в чем различия?


Ответ

Платформа Java - совокупность того, что вы описали. Это довольно абстрактный термин и в разном контексте он может трактоваться по разному. Иногда просто JRE, иногда все вместе даже с сервером приложений Java EE Другие языки на платформе Java могут исполняться многими путями. Как вы верно подметили, виртуальная машина Java исполняет байт код. Таким образом любой язык, компилятор которого сможет сгенерировать валидный байт-код, может быть исполняем на виртуальной машине Java. Насколько я знаю конкретно в случае со Scala все немного проще и используется механизм обобщения (дженериков) и свойство их стирания во время исполнения. В моем понимании, выражаясь терминами языка Java - JRE - это интерфейс, а JVM - это имплементация. JVM - немного шире, т.к. может включать некоторые криптографические возможности, оптимизации, компиляцию в нативный код и т.п., напрямую не обязательные для исполнения кода и его работоспособности, но сильно увеличивающие эффективность работы программы.