Страницы

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

суббота, 22 июня 2019 г.

Определение порта, к которому подключено устройство

Использую библиотеку jssc для использования COM-портов в java. Такая ситуация: к компьютеру подключена arduino, и надо в коде определить, к какому порту она подключена. Как это реализовать?


Ответ

С точки зрения компьютера, Ардуина является конвертером USB->COM, обычным USB-устройством, со своими VID и PID.
Вам нужно прочитать ветку реестра, выудить оттуда VID и PID, и по ним узнать имя COM порта.
Как это делается на C++ я уволок отсюда
///

/// Compile an array of COM port names associated with given VID and PID /// /// /// /// List ComPortNames(String VID, String PID) { String pattern = String.Format("^VID_{0}.PID_{1}", VID,PID); Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase); List comports = new List(); RegistryKey rk1 = Registry.LocalMachine; RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum"); foreach (String s3 in rk2.GetSubKeyNames()) { RegistryKey rk3 = rk2.OpenSubKey(s3); foreach (String s in rk3.GetSubKeyNames()) { if (_rx.Match(s).Success) { RegistryKey rk4 = rk3.OpenSubKey(s); foreach (String s2 in rk4.GetSubKeyNames()) { RegistryKey rk5 = rk4.OpenSubKey(s2); RegistryKey rk6 = rk5.OpenSubKey("Device Parameters"); comports.Add((string)rk6.GetValue("PortName")); } } } } return comports; }
static void Main(string[] args) { List names = ComPortNames("0403", "6001"); if (names.Count > 0) { foreach (String s in SerialPort.GetPortNames()) { if (names.Contains(s)) Console.WriteLine("My Arduino port is " + s); } } else Console.WriteLine("No COM ports found"); }

CIDER ругается на nRepl после обновления пакетов в Emacs

; CIDER 0.11.0snapshot (package: 20160125.741) (Java 1.8.0_72, Clojure 1.7.0, nREPL 0.2.10) WARNING: CIDER requires nREPL 0.2.12 (or newer) to work properly WARNING: The following required nREPL ops are not supported: apropos classpath complete eldoc format-code format-edn info inspect-pop inspect-push inspect-refresh macroexpand ns-list ns-vars ns-path refresh resource stacktrace toggle-trace-var toggle-trace-ns undef Please, install (or update) cider-nrepl 0.11.0-SNAPSHOT and restart CIDER WARNING: CIDER's version (0.11.0-snapshot) does not match cider-nrepl's version (not installed). Things will break! user>

Как устранить конфликты в пакетах?
project.clj:
(defproject lesson-rpg1 "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"]] :main ^:skip-aot lesson-rpg1.core :target-path "target/%s" :profiles {:uberjar {:aot :all}})
lein deps :tree
D:\CODE\Clojure\lesson-rpg1>lein deps :tree [clojure-complete "0.2.3" :exclusions [[org.clojure/clojure]]] [org.clojure/clojure "1.7.0"] [org.clojure/tools.nrepl "0.2.10" :exclusions [[org.clojure/clojure]]] D:\CODE\Clojure\lesson-rpg1>
lein version:
D:\CODE\Clojure\lesson-rpg1>lein version Leiningen 2.5.2 on Java 1.8.0_72 Java HotSpot(TM) 64-Bit Server VM D:\CODE\Clojure\lesson-rpg1>


Ответ

Сложилась неприятная ситуация
...в самом Leiningen будет указана старая версия tools.nrepl до следующего релиза. Поэтому нужно указать версию явно в проекте или профиле (см. далее):
[org.clojure/tools.nrepl "0.2.12" :exclusions [[org.clojure/clojure]]]
...и так, чтобы при этом не приклеивалась зависимость от конкретной версии Clojure. И ещё, похоже, потребуется это:
[cider/cider-nrepl "0.11.0-SNAPSHOT"]

Что происходит
Если проект не указывает версию org.clojure/tools.nrepl явно, то используется та, что распространяется с Leiningen, в вашем случае это оказалась старая версия 0.2.10
Можно действовать любым из следующих способов:
указать её явно прямо в проекте в списке зависимостей добавить в профиль по умолчанию (~/.lein/profiles.clj)
это зависимость, поэтому подлежит записи под ключом :dependencies обновить Leiningen и получить новую встроенную версию tools.nrepl
на данный момент неактуально, ждём очередного релиза Leiningen.
Поскольку речь о совместимости проекта с вашей собственной средой разработки (а код самого проекта не зависит от этого), первый вариант плохо подходит, а второй скорее "заплатка".

Подключение к базе данных. Когда создавать и сколько ему жить в веб-приложении?

Когда создавать подключение к базе данных?
На каждый запрос к базе На каждый HTTP-запрос Глобально в рамках домена - от старта приложения до его смерти
Первые два позволяют локализовать ошибки (обрыв связи с базой покрашит минимум запросов), обеспечит многопоточную обработку запросов к базе(?) на стороне веб-сервера.
Третий - сократит оверхед на подключениях, особенно если БД вынесена на отдельный сервер, но лишится плюсов первых двух.
Так что же лучше и в каких случаях стоит применять? Интересно это как по поводу чистого ADO.NET, так и EF (если под "подключением" мы будем понимать наследника DbContext). По поводу последнего в туториалах в интернете рассуждают о разнице между п.1 и п.2, но не п.3. Почему?


Ответ

Если у программиста возникает такой вопрос, то ему стоит использовать Entity Framework, по тому, что в данном случае фреймворк окажется умнее программиста, который своими попытками оптимизации с наибольшей вероятностью сделает только хуже.
Во первых, DbContext, это Unit of Work(как и ISession в NHibernate)
Наличие одного DbContext для всего приложения - плохая идея. Единственная ситуация, где это имеет смысл, когда у вас есть однопоточное приложение и база данных, которая используется исключительно этим экземпляром приложения. DbContext не поточно-безопасный, а так же DbContext кэширует данные, по этому вы быстро получите не актуальный кэш. Все это приведет к различным проблемам, когда несколько пользователей/приложений будут работать с этой базой данных одновременно. По этому если у вас не вышеописанная ситуация, то вам лучше инжектить DbContext в каждую задачу. Создавать же контекст на каждый запрос не лучший вариант с точки зрения производительности. Во первых при подключении происходит аутентификация и авторизация, во вторых вы теряете преимущества благодаря кешированию.
Другими словами, вам нужно выделять DbContext на каждую бизнес-задачу.

Каррирование в JavaScript

Каррирование - способ предварительного заполнения первых нескольких аргументов функции (а также возврата новой функции).
Т.е., я могу в коде предварительно заполнить несколько аргументов, а при вызове указать недостающие?
Function.prototype.curry = function () { // Запомнить функцию и предварительно заполнить ее аргументами переменные var fn = this, args = Array.prototype.slice.call(arguments); // Эта функция должна получить на вход сохраненные аргументы и новые return function() { var arg = 0; // Объединить заранее подготовленные аргументы сохраненные в замыкании с новыми аргументами for (var i = 0; i < args.length && arg < arguments.length; i++) { if (args[i] === undefined) { args[i] = arguments[arg++]; } } // вызвать каррирующую функцию со всеми аргументами return fn.apply(this, args); }; };
Т.е., если каррировать данную функцию:
function sum (a,b) return a + b;
То можно вызвать ее следующим образом:
var addTwo = sum.carry(2); addTwo(5); // Увеличение на 2 // Но на выходе NaN
Правильно ли я все понял с каррированием, и где может быть ошибка?


Ответ

Этот код рабочий.
Function.prototype.curry = function () { // Запомнить функцию и предварительно заполнить ее аргументами переменные var fn = this, args = Array.prototype.slice.call(arguments); // Эта функция должна получить на вход сохраненные аргументы и новые return function() { var arg = 0; // Объединить заранее подготовленные аргументы сохраненные в замыкании с новыми аргументами for (var i = 0; i < args.length || arg < arguments.length; i++) { if (args[i] === undefined) { args[i] = arguments[arg++]; } } // вызвать каррирующую функцию со всеми аргументами return fn.apply(this, args); }; }; function sum (a,b) { return a + b; } var addTwo = sum.curry(2); console.log(addTwo(5)); // Выводит 7
Ваши ошибки: надо в уcловии цикла, где объединяете массивы аргументов писать || а не &&, чтобы ориентироваться на самый длинный из массивов. Также вы допустили описку в var addTwo = sum.carry(2); - функция называется curry.

Как обновить service не перезапуская его?

Возможно ли такое, чтобы запускать сервис при запуске приложения, а затем после каких-либо операций на UI обновлять сервис без его перезапуска (т.е. сервис работает с начальными данными, затем пользователь что-то делает, данные передаются в сервис и он начинает работать уже с новыми данными, не делая при этом stopService(), startService) ?


Ответ

Да, можно.
При первом запуске сервиса вызывается его метод onCreate При каждом последующем вызове Context#startServise(Context ctx, Intent intent), при условии, что сервис уже запущен, вызовется его метод onStartCommand
Таким образом по умолчанию вы получаете нужное вам поведение и не сервис не перезапускается каждый раз при вызове startServise, а вызываете метод ранее созданного экземпляра класса.
При этом вы можете через содержимое интента передавать к-л данные, обновляя содержимое полей класса сервиса.

Также есть ещё механизм биндинга сервиса к активити, позволяющего в активити получить ссылку на экземпляр запущенного сервиса и напрямую вызывать методы его экземпляра примерно так: instanceOfServiceClass.someMethodInServiceClass(someArgument);. Загуглить можно по Android service Binder. Вот статья на русском: Service. Биндинг. ServiceConnection

Как менять цвета на календаре Android Time Square?

Я использую библиотеку Android Time Square календарь. Перерыл все файлы, там ссылается R. А там нельзя менять да и как hex менять... Вопрос как изменить цвета, тексты на Android Time Square?


Ответ

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

работа с socks5/4

http/https прокси я использую так:
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); WebProxy proxy = new Webproxy(host,port); req.Proxy = proxy; HttpWebRespone res = req.GetWebResponse();
Но с socks5/4 не удается получить Respone. Постоянно ошибка("Tor is not Http proxy"). Собственно вопрос: "какой класс поддерживает работу с socks5?"
Socks беру от TorBrowser.


Ответ

Для тех кто ищет. Самый простой способ это воспользоваться библиотекой xNet
HttpRequest req = new HttpRequest(); req.Proxy = ProxyClient.Parse(ProxyType.Socks5, "host:port"); var respone = req.Get("Https://google.com").ToString();