LINUX.ORG.RU

Сообщения alex4321

 

пуск/логирование/мониторинг всяческого софта (лучше не init)

Есть одна задача, которую было бы желательно решить с наименьшим количеством возни.

Есть софтина A (если точно - то поделие на django). Без дополнительных зависимостей.

Есть софтина B (поделие получает запросы с внешнего сервиса и обрабатывает их). В чистом виде от A не зависит. Для неё, положим, есть конфиги B1 и B2 (путь к конфигу софтина получает как один из аргументов. Других отличий нет, потому пилить кучи init скриптов желание ниже среднего). При этом в случае B1 - добавляется зависимость от A.

Во всех случаях A и B логируют всякое в stdout/stderr. Падают в случае какой-либо непредусмотренной НЁХ, конечно - неплохо бы получать уведомления о фейле.

Как автоматизировать руление этой гадостью? Включая запуск (кстати, нужен также и запуск по старту сервера)/остановку/перезапуск/доступ к логам. Желателен ещё какой-либо вебгуй, но это таки опционально.

Желательно - что-то удобнее вагонов и телег init-скриптов, да.

Линукс тут при том, что запускаться эта хренота будет на нём, конечно же.

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

з.ы. блин, это же не general :-)

alex4321
()

Tornado - где ошибка в роутинге (о ошибке в ДНК уже знаю :-) )

Собственно, код примерно таков :

class JsonRequestHandler(RequestHandler):
    def send_answer(self, answer):
        json_data = json.dumps(answer)
        wrapper = self.get_argument("jsonp_wrapper", None)
        if wrapper is None:
            self.set_header("Content-Type", "application/json")
            self.write(json_data)
        else:
            self.set_header("Content-Type", "application/javascript")
            self.write(wrapper + "(" + json_data + ")")
        self.finish()

    async def get(self):
        try:
            answer = await self._get()
            self.send_answer({"success": True, "response": answer})
        except Exception as err:
            self.send_answer({"success": False})

    async def _get(self):
        raise NotImplementedError()

class StocksHandler(JsonRequestHandler):
    async def _get(self):
        return await logic.stocks()

class StatsHandler(JsonRequestHandler):
    async def _get(self):
        filter = self.get_argument("q", "")
        assert filter != ""
        from_time = datetime.datetime.fromtimestamp(
            int(self.get_argument("from", 0))
        )
        to_time = datetime.datetime.fromtimestamp(
            int(self.get_argument("from", 0))
        )
        exclude_neutral = bool(self.get_argument("no_neutral", False))
        assert to_time >= from_time
        stock_id = await logic.classify_stock_tweets(filter)
        return await logic.stock_stats(stock_id, from_time, to_time, exclude_neutral)


config = Configuration.from_file(config_path)
logic = AppLogic(config)
asyncio.get_event_loop().run_until_complete(logic.initialize())
AsyncIOMainLoop().install()
application = Application([
    ('/stocks', StocksHandler,),
    ('/stats', StatsHandler,)
])
application.listen(config.port)
asyncio.get_event_loop().run_forever()

Однако - реакции на запрос к 127.0.0.1:8000/stocks?jsonp_wrapper=alert - хрен. Притом - если перепилить «роутинг» :

application = Application([
    ('/stocks', StocksHandler,),
    ('/stats', StatsHandler,)
])
то оно бодро возвращает результат.

 ,

alex4321
()

Ещё один не умеет в математику

Ну, то есть я не умею. Решил тут проверить степень подплинтусности моих познаний в основах ML. Поглядываю курс на Courserа. Пока самое начало - линейная регрессия. Тут лекция - https://www.coursera.org/learn/machine-learning/lecture/Z9DKX/gradient-descen... .

И чего-то я туплю. Вот ссылка на кусок скрина «теста» - http://i.imgur.com/hvQGJhv.png . Чего-то я не понимаю в первом варианте. В x-векторы, в theta - вектор. В y - числа. Но как получается theta x_i = sum_{j=0}^N {theta_j x_j} ?

 ,

alex4321
()

Как лучше организовать веб-приложение с долгой обработкой запроса и внешними сервисами?

Собственно, что оно будет делать:

  • запрашивать тексты с 1 сервиса
  • обрабатывать их 2 сервисом
  • возвращать результат обработки

    Притом - обработка может быть весьма долгой.

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

  • реализовать всю вышеуказанную работу
  • таск под это дело в celery

    Тогда - я смогу запускать задачу в celery, возвращать идентификатор, проверять её статус и по готовности - возвращать инфу о результате.

    Собственно - есть ли явно лучшие методы?

    И да - в python3.5 вроде завезли кучу всего асинхронного. С учётом того, что у меня одно дерганье внешних сервисов - вроде бы может дать профит. Вопрос в том, не будет ли в случае применения celery явных подводных камней?

 ,

alex4321
()

Yet another chatbot. Что бы такого собрать в качестве обучающей выборки?

Собственно, раз свой недоклассификатор я таки just for fun - запустил (и он даже иногда не даёт ложноположительных срабатываний :-) А иногда - даёт) - решил попробовать склепать бота на нём.

Ну то есть в зависимости от результата классификации юзверьского ввода - переходит по графу (нет, с учётом goto он уже не дерево :-) ) состояний. Вроде даже слегка работает на совсем простеньком наборе - http://pastebin.com/z09wJNpR, http://pastebin.com/XZwKP56e :-)

Что бы такого прогрепать на предмет тестовых примеров? В принципе, конечно, раскукожить какой-нибудь столь же древовидный сценарий от совсем жёсткого до чего-то подобного - можно, но как-то не впечатляет перспектива придумывать пяток-другой аналогов одной фразы :-) .

з.ы.1 тут же вроде прошёл ботохайп, а я нихрена не нашёл. Совем гуглить разучился, наверное.

з.ы.2 да, я знаю, что конкретно тут - можно было потрудиться над выборок ключевых слов. Но оно таки классифицировало и вещи чуток сложнее.

з.ы.3 при чём тут линух - я пока не придумал. Но наверное, это получится на нём запустить.

 , , чатбот

alex4321
()

Yet another text classifier.

sup, /dev. Не прошло и года, как я таки сподобился сделать подобие классификатора текста (на предобученном word2vec и свёрточной сети). Идея, конечно, не моя (да и реализация отчасти).

Код тут https://bitbucket.org/alex43210/pynlc/overview.

Хабропост с чутком подробностей и ссылками на то, у кого и что честно стянуто - https://habrahabr.ru/post/315118/. Вкратце - выборка из 22000 длинных текстов (5000 тестовых) на входе - ошибка (mse) около 1%, 400 коротких - 5%, 50 коротких (но там вообще всё можно свести к 1 слову на текст) - 1%. Какой-то я подозрительно везучий. Нужен в пух и прах ломающий всё датасет.

Ну и да, между делом возникли вопросы :

- есть ли в nltk возможность выделить взаимосвязи между словами (а то оно мне не выкинет «on» из «turn this machine off and wath on this schematic», ибо «turn» из «turn on» уже в тексте). Ну там чтобы «on» было узлом в дереве «turn», как-то так. Вроде нет, но вдруг я очень плохо ищу.

- есть ли готовые алгоритмы коррекции очепяток, учитывающие как расстояние, допустим, Левенштейна, так и расстояние между векторами словарного слова и обучающей выборки? Даже не представляю, как искать - google://levenshtein+word2vec+misstype не помогает, например.

 ,

alex4321
()

Оцените идиотизм (скорее идеи, чем кода)

В общем, я доделал свою YOBA-библиотеку для комбинирования IBM-х Dialog-а (читай - сервис, реализующий такой себе автомат, проверяющий соответствие ввода регулярке - что не особо хорошо подходит, если нужно иметь кучу формулировок), NLC (читай - выбор категории, в которой попались наиболее похожие на введенную фразы) и ... бинго, блин. То есть Bing-го переводчика. Который юзается, чтобы скормить хоть как-то переведенный русский.

Код на https://github.com/alex4321/watson-dialog-nlc-robot . Уже готов ловить тапки за использование жидкобрейновой поделки, впрочем с жабой результат вполне себе стыкуемый :-)

з.ы. да, аватарка в связи с текущими событиями и тем, что я просрал дедлайны (установленные самим собой. Впрочем, самому себе же).

 

alex4321
()

Идиотский вопрос про java и maven - как забороть java.lang.NoClassDefFoundError ?

Собственно, по запуску падает с :

$ java -jar botweb-1.0-SNAPSHOT.jar ../test/config.json
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        at com.alex4321.botweb.Database.initialize(Database.java:11)
        at com.alex4321.botweb.Application.main(Application.java:23)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 2 more

Ну то есть в

Configuration configuration = new AnnotationConfiguration().configure();
(где AnnotationConfiguration - класс из Hibernate).

В pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.alex4321.botweb</groupId>
    <artifactId>botweb</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.7</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>1.0.2-1</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>3.0.0.ga</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.3.0.ga</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.3-1102-jdbc41</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.12.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alex4321.bot</groupId>
            <artifactId>bot</artifactId>
            <scope>system</scope>
            <version>1.0-SNAPSHOT</version>
            <systemPath>${basedir}/lib/bot-1.0-SNAPSHOT.jar</systemPath>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.alex4321.botweb.Application</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <!-- here the phase you need -->
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>lib/</directory>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

mvn package, конечно, завершается успешно. Как я понимаю - класс org/dom4j/DocumentException должен валяться в dom4j-1.6.1.jar, который в результате выполнения вполне себе оказывается в target :

$ pwd
/c/Users/gauss.DESKTOP-L34SIKM/IdeaProjects/untitled/target

gauss@DESKTOP-L34SIKM MINGW64 ~/IdeaProjects/untitled/target
$ cd ..

gauss@DESKTOP-L34SIKM MINGW64 ~/IdeaProjects/untitled
$ mvn package
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.877 s
[INFO] Finished at: 2016-06-29T11:19:00+03:00
[INFO] Final Memory: 38M/719M
[INFO] ------------------------------------------------------------------------

gauss@DESKTOP-L34SIKM MINGW64 ~/IdeaProjects/untitled
$ cd target

gauss@DESKTOP-L34SIKM MINGW64 ~/IdeaProjects/untitled/target
$ ls doc4*.jar
ls: cannot access 'doc4*.jar': No such file or directory

gauss@DESKTOP-L34SIKM MINGW64 ~/IdeaProjects/untitled/target
$ ls dom4*.jar
dom4j-1.6.1.jar

Однако :

gauss@DESKTOP-L34SIKM MINGW64 ~/IdeaProjects/untitled/target
$ java -jar botweb-1.0-SNAPSHOT.jar ../test/config.json
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        at com.alex4321.botweb.Database.initialize(Database.java:11)
        at com.alex4321.botweb.Application.main(Application.java:23)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 2 more

 ,

alex4321
()

Что есть попроще для вебни на Java?

Есть библиотека на Java. Требуется дергать её функциональность по сети. По идее - пара-тройка роутов, по которым нужно отдать соответсвующий JSON. Какими средствами проще сделать? (БД не нужны, требования к производительности/нагрузкам (в разумных пределах) не рассматриваем - оно с вероятностью 100500% загнётся раньше, чем будет приюзано 3.5 калеками). Если в процессе не нужен какой-либо дополнительный сервер (читай - Tomcat и прочее) - вообще шикарно. Всё равно в силу вышесказанного очень влом его осваивать. Хотя, сойдёт и такое. з.ы. cgi не предлагать - об этом варианте уже знаю.

 

alex4321
()

Где б взять текстов?

sup /talks/ Для одной задачи неплохо бы заиметь здоровый кусок текстов на русском (по крайней мере поначалу - наличие отсутствия специализированных терминов не будет критично) без разметки (голый текст, да) с минимальным числом очепяток. Ну то есть - ясен пень, можно склеить кучу литературы, но может есть готовые подборки?

 

alex4321
()

Deadbeef - в режиме дизайна показывает контекстное меню предка

Собственно, клепаю плагин к deadbeef-у. Застопорился на следующем (код только примерный) :

...
ui->w_reg_widget("HELLO", 0, &create_widget, "HELLO", NULL);
...
ddb_gtkui_widget_t* create_widget()
{
    base = (ddb_gtkui_widget_t*)malloc (sizeof (ddb_gtkui_widget_t));
    memset (base, 0, sizeof (ddb_gtkui_widget_t));  
    base->widget = gtk_label_new("HELLO");
    gtk_widget_show(base->widget);
    ui->w_override_signals(base->widget, base);
}

Виджет-то создается, я даже виже его. Однако же - если я располагаю из режима дизайна его, например, в HBox-е и вызываю контекстное меню - вызывается HBox-е. Куда копать?

Deadbeef 0.7.0

 ,

alex4321
()

QTcpServer - слот для newConnection не вызывается

Задача такая, что мне требуется прицепить к приложению не на qt библиотеку, реализующую работающий в отдельном потоке tcp-сервер . Ну и т.к. более-менее знаком с Qt - решил приюзать его.

class App : public QApplication 
{
  Q_OBJECT
  private:
    Server* server;
    static App* instance;
    App(int argc, char** argv);
    static int getArguments(char*** argv);
    static void* thread(void*);
  public:
    static App* get();
    void run();
}
App* App::instance = NULL;

App::App(int argc, char** argv) : QApplication(argc, argv) {
  server = new Server();
  if (! server->listen()) {
    log() << "Server not listening";
    server->close();
    return;
  }
  log() << "Server listening";
}

App* App::get() {
  if (App::instance == NULL) {
    char** argv;
    int argc = App::getArguments(&argv);
    App::instance = new App(argc, argv);
  }
  return App::instance;
}

void* App::thread()
{
  log() << "Application thread";
  App::get()->exec();
  return NULL;
}

void App::run()
{
    pthread_t thread;
    pthread_create(&thread, NULL, App::thread, NULL);
}
class Server : public QTcpServer
{
  Q_OBJECT
  private slots:
    void onNewConnection();
  public:
    explicit Server(QObject* parent = NULL);
    bool listen();    
}
Server::Server() {
  connect(this, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

bool Server::listen() {
  return ((QTcpServer*)this)->listen(HOST, PORT);
}

void Server::onNewConnection() {
  debug() << "New connection";
  QTcpSocket* socket = this->nextPendingConnection();
  socket->write("HELLO");
}

Ну и в своей вызываемой из сторонней программы функции:

App::get()->run();

В результате имею :

Server listening
Application thread
Однако же, при попытке прицепиться telnet-м :
telnet 127.0.0.1 8070
Он вроде как цепляется, но искомого hello нет. Да и в отладочном логе New connection тоже нет. Куда копать?

upd. а нет - пока упрощал вам тут, выяснил какой участок вызывал ошибку. Такое сработало бы.

 

alex4321
()

SDCC - «multiple definition of ...» при попытке сборки проекта из нескольких файлов (ifndef не забыл)

Я снова с своим быдлокодингом для STM8S. Собственно, следующая структура : - main.c с «главной» частью программы. - gpio.h с gpio_init(), gpio_read(uint8_t pin) и некоторыми переменными (которые можно и вынести, но хотелось бы понять, что я делаю не так). - gpio.c с реализацией функций из gpio.h

Т.е. примерно так main.c

#include "gpio.h"

int main() {
  gpio_init(); 
  ...
}

gpio.h

#ifndef GPIO_H
#define GPIO_H

...
GpioConfigType config;

void gpio_init();
...

#endif

gpio.c

#include "gpio.h"
...

Команды сборки мейком выполняются следующие:

# sdcc -c -mstm8 -I lib/stm8/inc -D STM8S003 -o build/ gpio.c
# sdcc -c -mstm8 -I lib/stm8/inc -D STM8S003 -o build/ main.c
# sdcc -mstm8 -I lib/stm8/inc -D STM8S003 -o build/ build/gpio.rel build/main.rel
Multiple definition of _config

Что может быть не так? config в main.c не применяется - т.е. можно и в gpio.c вынести, но не хотелось бы.

 

alex4321
()

Как определить, пуст ли stdin

Собственно, программа должна выполнять задачу, зависящую от поступающих по мере работы данных. При этом - если новых данных нет - то она не должна прерывать выполнение(читай - работать со старыми).

То есть что-то типа :

Data* data;
while(...) {
  task(data);
  if (! stdinEmpty()) {
    readData(data);
  }
}

 

alex4321
()

STM8, вывод - ЧЯДНТ?

Собственно, пытаюсь помигать диодом (ну ладно - пока вообще просто запустить его) на плате с контроллером stm8s003f3. Нужно задействовать PD3. Собираю sdcc и stm8flash. Как я понимаю - я должен выставить единицы соответствующим битам в PD_DDR и в PD_ODR?

#include <stdint.h>
#define PD_ODR *(unsigned char*)0x500F
#define PD_DDR *(unsigned char*)0x5011

void delay(uint32_t t) {
	while (t) t--;
}

int main( void )
{
	uint8_t val = 0b11111111;
	PD_DDR=0b11111111;
	while (1) {
		val = val ^  0b11111111;
		PD_ODR = val;
		delay(20000);
	}
	return 0;
}

мейкфайл следующий :

CC=sdcc
CFLAGS=-mstm8
INCLUDEPATH=lib/stm8/inc/
DEFINES= STM8S003
SOURCE=src/main
OUTPUT_DIR=build/
all:	compile flash
compile:	
	mkdir -p $(OUTPUT_DIR)
	$(CC) $(CFLAGS) -I $(INCLUDEPATH) -D $(DEFINES) -o $(OUTPUT_DIR) $(SOURCE).c 
flash:	
	stm8flash -c stlinkv2 -p stm8s003 -w build/main.ihx

Но на выходе имею 0. При этом, при попытке залить тем же stm8flash заранее слитую родную прошивку - она работает корректно.

upd. Однако, одна глупая ошибка была - но по исправлении ничего не поменялось. Новый код в посте.

 , ,

alex4321
()

Как получить текущую раскладку клавиатуры? (или заставить xephyr использовать её?)

В общем, задача стоит такая :

  • есть приложение, запущенное «снаружи» (DISPLAY=:0.0)
  • есть второе, запущенное «внутри» xephyr-а (DISPLAY=:1.0).
  • есть третье запущенное в xephyr приложение (вообще - второе, это скорее что-то wm-подобное) - (DISPLAY=:1.0)

Нужно обеспечить корректную смену раскладок.

Как я понял, «из коробки» xephyr позволяет задать только 1 «стартовую» раскладку (или ошибаюсь?) В рамках костыля вижу такой вариант - у 1 и 2 приложения есть расшаренная память, в которой можно, ко всему прочему, положить название раскладки.

Тогда второе могло бы просто выполнять по мере изменения

DISPLAY=:1.0 setxkbmap <layoutName>
Но - как мне получить текущую раскладку? Пока удалось наткнуться на советы вида :
# setkbxmap -print
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+us+ru:2+inet(evdev)+group(alt_shift_toggle)+terminate(ctrl_alt_bksp)"	};
	xkb_geometry  { include "pc(pc105)"	};
};
Но спарсить конкретно текущую нельзя, т.к. её тут нет.

В рамках извращений - следующее :

case "$(xset -q|gr LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac
но это какой-то очень странный вариант, нет? (можно определить возможные раскладки по списку выше, а потом подобным образом - текущую, но какой-то непрямой метод).

Также нашёл гномоспецифичное org/gnome/desktop/input-sources/current, но в моём mate оно всегда выставлено в 0.

Есть какие-то ещё варианты?

 

alex4321
()

RSS подписка на новые темы