LINUX.ORG.RU

Сообщения Ivana

 

Фильтрация пайпа с посимвольным чтением

Форум — General

Столкнулся с задачей фильтрации потока, но читая его не построчно, а посимвольно. Поэтому все grep -v, sed, rt не подходят. Собственно, вопрос - есть ли какая готовая утилита или мне писать свою?

 , ,

Ivana
()

Ubuntu: нехватка памяти или ненастроенный postgres?

Форум — Desktop

Жил на Винде-7, имел забитый на 70% 500Гб SSD диск, все было хорошо. Но потребовалось установить Ubuntu. Ставил через WUBI, т.к. другие более подробные мануалы по установке ниасилил. Сейчас при старте компа появляется выбор из 2 операционок (как надо) и еще какой-то Граб (по ошибке поверил одному описанию установки, но это вроде не мешает). Параметры системы: Память 3,6 ГиБ, Диск 18,2 ГБ. По команде free -h выдает

              всего        занято        свободно      общая  буф./врем.   доступно
Память:        3,6G        2,8G        118M        400M        620M        120M
Подкачка:        255M        255M          0B
при попытке запуска postgres валится с ошибкой
postgres & 0
FATAL:  could not map anonymous shared memory: Cannot allocate memory
HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 2227576832 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
гуглил - пишут, что можно настраивать postgres, чтобы он не был таким прожорливым. А я не знаю, может у меня настолько мало свободной памяти, что это уже не поможет? И можно ли теперь как-то добавить еще памяти в систему, или уже поздно, диск размечался при установке? Переставлять все по новой? И весь установленный уже софт и т.п.? Что скажете, доктора?

 , ,

Ivana
()

Комп с Windows 7, нужна Xubuntu - как ставить?

Форум — Linux-install

Здравствуйте.

Я наконец-то морально созрел для установки Убунты на мою Винду 7 (ради Хаскеля). Правильно понимаю, что лучше это сделать через виртуальную машину, а не рядом еще одну ОС и выбирать при старте? Если через виртуалку - то вот здесь http://www.instructables.com/id/Introduction-38/ советуют скачать последнюю Оракловую. Но у меня среди установленных программ есть уже Windows virtual PC. Мне лучше использовать ее, или скачать ту по ссылке? Это одна и та же програама, но скачанная версия будет новее, или это вообще разные производители (Оракл и Майкрософт)? И что тогда ставить? (Куда ставить-то? (С) Добро пожаловать или посторонним вход воспрещен )))))

ЗЫ в одном чатике мне сильно рекомендовали такую штуку, как Vagrant. Говорят, она сильно помогает при работе с виртуалками. Но под него VMWare или Virtual PC или Оракловскую виртуалку - что выбрать?

Простите за возможно дилетантские вопросы, но никогда не сталкивался ни с системами виртуализации, ни с Линуксом. Вариант «снести Винду нахрен и забыть о ней» я знаю, но в моей ситуации он не подходит. Что посоветуете, доктора?

 , , ,

Ivana
()

Прикрутил свой Liscript - РЕПЛ в виде бота к гиттеру (слаку, телеграму, ИРЦ)

Форум — Development

Прикрутил чат-бот интерфейсы к своему эвалюатору. Гиттер: https://gitter.im/liscript/public Слак (надо персонально инвойсы рассылать): https://liscript.slack.com Телеграм: Liscript-bot IRC: куда хочешь

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

 , , ,

Ivana
()

Наш Кинг-Конг против вашего Годзиллы - 1:0 после первого раунда :)

Форум — Talks

Правда, до рисования кругов пока так и не дошли. Но 18-страничный спарринг удался: http://www.cyberforum.ru/oop/thread1905936.html

ЗЫ на dxdy что-то пока не разгорается http://dxdy.ru/topic115224.html Но там нравы суровые, забанят сразу за милую душу! :)

Перемещено tailgunner из development

 ,

Ivana
()

Помощь в рефакторинге java-кода

Форум — Development

Есть приложение. Написано собственноручно, ГУИ на Swing, по кнопкам в отдельных потоках запускаются задачки, которые после выполнения выдают в окошки результаты своего выполнения. После написания функционал и интерфейс несколько раз изменялись/расширялись, многие вещи сделаны заплатками, неоптимально, и изначальное отсутствие стройной архитектуры этому только способствовало. Что хочется - на данном конкретном примере продумать и реализовать удобную для масштабирования архитектуру, чтобы потом без особых сверхусилий оставив без изменения классы логики заменить интерфейс на FX например, или вообще прикрутить вэб-интерфейс сначала для локального приложения, а впоследствии сделать полноценное вэб-приложение с публикацией на сайте.

Если есть желающие поменторить и направить в нужном направлении, прошу отписаться в теме или в личке (если она на ЛОРе вообще есть :) ).

 , ,

Ivana
()

Свой велосипед - вычисления в переданном окружении

Форум — Development

Захотел я добавить в свой схемоподобный язык давно лежащую на поверхности идею: вычисления в любом переданном контексте (окружении). Дописал 4 строчки кода - добавил новую ядерную особую форму eval-in, которая принимает лямбду (ибо у меня нет окружений как объектов первого класса, но это и не требуется, ибо лямбды содержат их в себе как замыкания) и список, который надо вычислить в окружении этой переданной лямбды. Пример:

; генератор замыканий ;
(defn f (x y) lambda ())
; создание пары объектов-замыканий с разными параметрами ;
(def a (f 1 2) b (f 10 20))
; вычисления в контексте переданного замыкания ;
(print (eval-in a (+ x y)) \n)
(print (eval-in b (def x 30) (+ x y)) \n)
 
........
 
=> 3
50
OK
Все хорошо работает. Но тут я подумал, что можно выпилить эту особую форму обратно из языка, ибо имхо того же можно добиться следующим образом: замыкание возвращает унарную лямбду, ожидающую на входе нульарный макрос, который она будет вычислять в своем окружении. Макрос у нас гражданин первого класса, может передаваться в качестве параметра в функции, и по семантике своего замкнутого окружения не имеет и будет вычисляться в окружении вызова, откуда и будет черпать свои свободные переменные:
; генератор замыканий, принимающих макрос для выполнения в своем контексте ;
(defn f (x y) lambda (m) m)
; создание пары объектов-замыканий с разными параметрами ;
(def a (f 1 2) b (f 10 20))
; вычисления макросов в контексте переданного замыкания ;
(print (a (macro () + x y)) \n)
(print (b (macro () (def x 30) (+ x y))) \n)
- выдает тот же результат. Но потом я подумал еще, и понял, что вариант с макросами уже по возможностям - например, создание новых переменных тут происходит в контексте лямбды, и не меняет контекст f, в отличие от варианта с eval-in. Макросами можно изменять значения переменных контекста f (через set!), но не добавлять новые. Хотя может можно придумать, как обойти это ограничение.

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

 ,

Ivana
()

Scheme - скорость выполнения кода

Форум — Development

Не буду писать многабукаф - просто скажите, сколько (по времени в секундах) в Scheme выполняется данный кот:

(define (divs n)
    (define (go i a)
        (cond ((> (* i i) n) a)
              ((= (* i i) n) (+ 1 a))
              ((= 0 (modulo n i)) (go (+ 1 i) (+ 2 a)))
              (else (go (+ 1 i) a))))
    (go 1 0))
 
(define (task n k)
    (cond ((>= 500 (divs k)) (task (+ 1 n) (+ k n 1))) (else k)))
 
(display (task 1 1))
Я пробовал несколько онлайн вычисляторов, и время выполнения различается на порядки. Где-то указывают реализацию (chiken / guile), где-то нет. Здесь https://repl.it/languages/scheme какое-то неприличное время выполняется, здесь https://www.tutorialspoint.com/execute_scheme_online.php весьма неплохо (относительно остальных), на Ideone и Rextester промежуточные показатели... Я в растерянности - где правда?

 , ,

Ivana
()

Структура файла настроек java-приложения

Форум — Development

Внезапно столкнулся с вопросом - есть GUI-приложение на Java, и надо добавить функционал кастомизации пользовательских настроек с их запоминанием между вызовами - например, размер шрифтов окон и т.п. Навскидку видится такой вариант - при старте приложение ищет рядом со своим исполняемым файлом файл настроек - пусть он называется «settings.четатам», если он есть - анализирует его, заполняет внутренний объект - таблицу настроек и вызывает функцию (метод) применения этих настроек. Если файла нет, таблица заполняется дефолтными настройками. В самом приложении кнопочка «сетингз», открывающая модальный диалог настроек, при открытии значения в диалоговой форме заполняются из файла (или дефолтными, если файла нет), при сохранении - значения из диалога заполняются в таблицу, сохраняются в файл и вызывается вышеупомянутый метод применения настроек. Вроде все понятно (кроме деталей, которые придется решить по ходу), но решил уточнить:

1) правильна ли сама концепция? 2) в каком формате сохранять файл настроек? Смотреть вшитые/библиотечные методы глубокой сериализации объектов в языке в строку или сразу в файл? А если он будет человеконечитаем - то и фиг бы с ним? Или писать свой велосипед/формат? 3) что еще я не учел/не знаю? Задача, судя по всему, наитипичнейшая и 100500 раз всеми решенная, поэтому думаю, должны быть наработанные стандартные ее решения.

 , ,

Ivana
()

Хочу написать вэб-приложение

Форум — Development

Собственно, сабж. Никогда с вэбом не сталкивался, даже в архитектуре клиент-сервер ничего не писал, с БД не работал, HTML/CSS/Javascript/Php/ и т.п. не умею, опыта вообще ноль. Хочу - чтобы в браузере открывалась страничка с удаленного сервера, я ввожу текст в поле - идет запрос на сервер, и в другое поле выводится ответ или в третье рисуется графический примитив, допустим. через ajax какой-нибудь или что там еще. В перспективе развития - чтобы несколько человек зашло на страницу и при команде от любого ответы приходили всем. Собственно, вопрос - сейчас 100500 модных слов, технологий и фреймворков - что посоветуете для данной задачи? Какой сервер, и т.п. Особых наворотов не надо, платные компоненты также не хочется рассматривать.

 , , ,

Ivana
()

Тестирование «чистой» asm функции

Форум — Development

Написал я, к примеру, процедуру умножения двух 10-битных чисел (с АЦП приходят такие) в 3 байта результата - для МК у которого нет аппаратного умножения (ATTiny13, в Атмел Студии 6). Проверил на нескольких примерах - работает. Захотел проверить для всего диапазона значений (вполне по силам, всего 10^6 вариантов) - и встрял. На асме могу накидать циклы - но там нет референса с чем сравнивать (умножения то нет). Могу на своем Блабе написать эмулятор этого восьмибитного контроллера, и это даже совсем не сложно, и проверять что угодно... Или можно создать Си-МК-проект, вызвать там мою асм-функцию, передавать ей входные параметры в нужные регистры, и сравнивать с тем, что посчитает компилятор по функции * ? Как это вообще делается?

 , ,

Ivana
()

Java - получить класс типа-примитива по имени

Форум — Development

Организую interpop с java. Все работает, создаю классы методом Class.forName(...), инстансы, нахожу методы и вызываю их с параметрами. Для нахождения методов использую getDeclaredMethod(methodName, paramTypes), в массив параметров типов метода помещаю опять же классы,найденные по имени. Но некоторые методы в качестве параметров принимают типы-примитивы, и передача им Class.forName(«java.lang.Double») напрямую не работает. Работает double.class или Double.TYPE. Но последние варианты неудобно получать из строки - надо заводить отдельную таблицу соответствия строка - примитивный тип. Может есть какой-нибудь удобный метод получения класса типа-примитива из какго-либо строкового представления?

 

Ivana
()

Выложил свой java-проект на github

Форум — Development

https://github.com/Ivana-/Liscript-GUI-Java-Swing

Если у кого будет желание конструктивно покритиковать, с интересом почитаю. А критиковать там есть что, ибо мне самому не нравится как многое сделано, но как могу на текущий момент.

 , , ,

Ivana
()

Java - кроссплатформенное чтение UTF-8 файла в одну длинную строку

Форум — Development

Делал так (взял откуда-то из инета):

File file = new File(fileAbsolutePath);
String s = new Scanner(file).useDelimiter("\\Z").next();
Всего пара строк, в s - весь файл. У меня на windows 1251 по умолчанию, такие файлы читаются нормально. Но на линуксах все не так, да и вообще хочется универсальный вариант. Задача простейшая - выбрать кроссплатформенную кодировку, например UTF-8, и сделать чтобы везде она правильно читалась. Смотрю интернет - как обычно в java: куча вариантов, классов, депрекейтед методов и т.п. Чтение построчное... Вопрос - могу я в 21 веке просто и универсально решить эту сложнейшую сверхзадачу - прочитать текст в строку? По возможности не в 200 строк кода, хотя если в java все так принято, то сойдет хоть как.

 ,

Ivana
()

Invalid or corrupt jarfile

Форум — Development

В IntelliJ IDEA-14 создал проект, в параметрах версия Java 1.8, на моем компе запускается и из IDEA, и jar-артифакт. Перенес jar на другой комп, поставил там Java 1.8.66 распоследнюю - пишет такую ошибку при запуске. Про manifesrt ничего не знаю пока, буду читать еще.

java -cp launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar co.pseudononymous.Server
по совету с http://stackoverflow.com/questions/7...rrupt-jar-file не помогает.

Как вообще надо создавать нормальные стандалон-приложения на java?

 ,

Ivana
()

Swing - подсветка синтаксиса. Варианты реализации?

Форум — Development

Господа, это снова я, только не бейте пожалуйста :) И все еще на Swing, да. Потом буду на пробовать JavaFX, честно.

Хочу простого - многострочное текстовое поле с подсветкой синтаксиса собственного языка. По минимуму - выделение цветом ключевых слов, строк внутри кавычек, числовых констант, и подсветка парных скобок от текущего положения курсора. По максимуму - нет предела совершенству Да, реализация пока на Swing - компонентах, потом планируется вариант на JavaFX. Беглый просмотр инета дал 3 общих варианта:

1) Готовые библиотеки где все из коробки. В принципе не против, только смущает их тяжеловесность, наличие ненужного функционала (мне только свой язык подсвечивать). Но зато там бывает и нумерация строк, и подсветка текущей строки, и свертка-развертка по плюсикам и т.п., что интригует. И конечно надо выбрать библиотеку (например, RSyntaxTextArea) и умудриться подключить её к проекту.

2) Свои написания с нуля на JEditorPane, Document и EditorKit.

3) Вариант 2, но на JTextComponent, java.text.AttributedString и еще каких-то непонятных пока компонентах.

Что посоветуете, доктора?

 , , ,

Ivana
()

Дошлифовать Swing GUI desktop application

Форум — Development

Хотел написать для Андроида, но решил протестировать и доделать рабочий вариант для компа. Первый блин на Java, выбор пал на Swing поскольку инет завален ссылками по нему, а с JavaFX связываться не решился. Собственно, от интерфейса требуется минимализм, надежность и кроссплатформенность. Это РЕПЛ (рид-эвал-принт-лууп) одного языка, в нижнем окне набираются команды, в верхнем отображается результат (как он будет готов). Здесь только UI оболочка, парсинг и вычисление вынес в отдельные классы, здесь стоят заглушки. Собственно, хотел узнать - это так вообще делается? Прямо класс Main наследуется от JFrame и вся UI логика прописывается в нем? Или выделять отдельный класс для этого? Как сделать изменение мышкой относительных размеров окон ввода и вывода (сейчас они у меня в таблице, высота одинакова)? Хорошо ли из отдельного потока выполнения изменять элементы UI перед завершением потока? Если лучше делать это в основном потоке, то как организовать красивый надежный коллбэк по завершению потока вычислений? Ну и вообще, любая конструктивная критика/рекомендации приветствуются.

package com.company;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class Main extends JFrame {

    private static JTextArea textArea;
    private static JEditorPane textAreaIn;
    private static DefaultListModel<InterThread> threadListModel =
            new DefaultListModel<InterThread> ();
    private static JList threadList = new JList<InterThread> (threadListModel);
    private static JToolBar buttonsPanel;

    public Main() {
        super("GUI REPL");

        textArea = new JTextArea(5, 30);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        textArea.setFont(new Font("Courier New", Font.PLAIN, 12));

        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(500, 300));
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        final StyleContext sctextAreaIn = new StyleContext();
        final DefaultStyledDocument doctextAreaIn = new DefaultStyledDocument(sctextAreaIn);
        textAreaIn = new JTextPane(doctextAreaIn);
        final Style style0 = sctextAreaIn.addStyle("emptyStyle", null);
        style0.addAttribute(StyleConstants.FontSize, 12);
        style0.addAttribute(StyleConstants.FontFamily, "Courier New");
        doctextAreaIn.setParagraphAttributes(0, 1, style0, true);

        JScrollPane scrollPaneIn = new JScrollPane(textAreaIn);
        scrollPaneIn.setPreferredSize(new Dimension(500, 300));
        scrollPaneIn.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        threadList.setCellRenderer(new DefaultListCellRenderer() {
            @Override
            public Component getListCellRendererComponent(
                    JList<?> list, Object value, int index, boolean isSelected,
                    boolean cellHasFocus) {
                Component renderer = super.getListCellRendererComponent(
                        list, value, index, isSelected, cellHasFocus);
                if (renderer instanceof JLabel && value instanceof Thread) {
                    ((JLabel) renderer).setText(((Thread) value).getName());
                }
                return renderer;
            }
        });
        threadList.setFont(new Font("Courier New", Font.BOLD, 20));

        JScrollPane scrollPaneThreads = new JScrollPane(threadList);
        scrollPaneThreads.setPreferredSize(new Dimension(150, 300));
        scrollPaneThreads.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);


        JLabel lastLoadFileNameLabel = new JLabel();

        Action sendUserInputAction = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendUserInput();
            }
        };
        JButton sendUserInput = new JButton();
        sendUserInput.setAction(sendUserInputAction);
        sendUserInput.setText("send (CTRL+ENTER)");
        sendUserInput.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.CTRL_MASK)
                        , "sendUserInputAction");
        sendUserInput.getActionMap().put("sendUserInputAction", sendUserInputAction);


        Action loadFileAction = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileopen = new JFileChooser();
                fileopen.setFileFilter(new FileNameExtensionFilter("TXT files", "txt"));
                int ret = fileopen.showDialog(getParent(), "Выберите файл скрипта");
                if (ret == JFileChooser.APPROVE_OPTION) {
                    File file = fileopen.getSelectedFile();
                    try {
                        String s = new Scanner(file).useDelimiter("\\Z").next();
                        lastLoadFileNameLabel.setText(file.getAbsolutePath());
                        startNewThread(false, s);
                    } catch (IOException ex) {
                        cout(true, "problem accessing file " + file.getAbsolutePath());
                    }
                }
            }
        };
        JButton loadFile = new JButton();
        loadFile.setAction(loadFileAction);
        loadFile.setText("load file");

        Action reloadFileAction = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String fileAbsolutePath = lastLoadFileNameLabel.getText();
                try {
                    File file = new File(fileAbsolutePath);
                    String s = new Scanner(file).useDelimiter("\\Z").next();
                    startNewThread(false, s);
                } catch (IOException ex) {
                    cout(true, ex.getLocalizedMessage());
                }
            }
        };
        JButton reloadFile = new JButton();
        reloadFile.setAction(reloadFileAction);
        reloadFile.setText("reload file");

        Action showActiveThreadsAction = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
                ThreadGroup parent;
                while ((parent = threadGroup.getParent()) != null) {
                    threadGroup = parent;
                    Thread[] threadList = new Thread[threadGroup.activeCount()];
                    threadGroup.enumerate(threadList);
                    for (Thread thread : threadList)
                        cout(true, thread.getThreadGroup().getName()
                                + " " + thread.getPriority()
                                + " " + thread.getName());
                }
            }
        };
        JButton showActiveThreads = new JButton();
        showActiveThreads.setAction(showActiveThreadsAction);
        showActiveThreads.setText("active threads");


        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(scrollPaneThreads, BorderLayout.EAST);

        JPanel textsPanel = new JPanel(new GridLayout(2,1));
        textsPanel.add(scrollPane);
        textsPanel.add(scrollPaneIn);
        getContentPane().add(textsPanel, BorderLayout.CENTER);

        sendUserInput.setDefaultCapable(true);

        buttonsPanel = new JToolBar(SwingConstants.VERTICAL);
        buttonsPanel.add(sendUserInput);
        buttonsPanel.addSeparator();
        buttonsPanel.add(loadFile);
        buttonsPanel.add(reloadFile);
        buttonsPanel.add(showActiveThreads);
        getContentPane().add(buttonsPanel, BorderLayout.WEST);
        getContentPane().add(lastLoadFileNameLabel, BorderLayout.SOUTH);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public class Read {
        public Object read(String s) { return "(" + s + ")"; }
    }

    public class Eval {
        Eval() {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                //e.printStackTrace();
            }
        }
        public Object eval(Object o) { return "evaluated: " + o.toString(); }
    }

    public class InterThread extends Thread {
        public String expression;
        public boolean showEcho;

        InterThread(boolean _showEcho, String _exp) { showEcho = _showEcho; expression = _exp; }

        public void run() {
            try {
                Object ro = new Read().read(expression);
                if (showEcho) cout(true, ro.toString());
                cout(true, new Eval().eval(ro).toString());
            } catch (Throwable e) {
                cout(true, e.toString());
                Thread.currentThread().interrupt();
            }
            textAreaIn.setText("");
            if (threadListModel.contains(this))
                threadListModel.remove(threadListModel.indexOf(this));

            for (Component c : buttonsPanel.getComponents()) {
                if (c.getClass().getSimpleName().equals("InterThreadJButton")) {
                    if (((InterThreadJButton) c).thread.equals(this))
                        buttonsPanel.remove(c);
                }
            }
            buttonsPanel.updateUI(); // .revalidate();
        }
    }

    class InterThreadJButton extends JButton {
        public InterThread thread;

        InterThreadJButton(InterThread t) {
            thread = t;

            Action interruptAction = new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    cout(true, "interrupt");
                    thread.interrupt();
                    cout(true, thread.getName());
                }
            };
            this.setAction(interruptAction);
            this.setText(thread.getName());
        }
    }

    public void startNewThread(boolean showEcho, String exp) {
        if (exp == null || exp.trim().isEmpty()) return;

        InterThread it = new InterThread(showEcho, exp);
        it.start();
        threadListModel.addElement(it);
        buttonsPanel.add(new InterThreadJButton(it));
    }

    public static void cout(boolean ln, String s) {
        if (s == null) return;
        if (ln) textArea.append(s + "\n"); else textArea.append(s);
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    public void sendUserInput() {
        startNewThread(true, textAreaIn.getText());
    }

    //--------------------------------- MAIN -----------------------------

    public void run() throws FileNotFoundException {
        cout(true, "Lets begin");
    }

    public static void main(String[] args) throws FileNotFoundException {
        Main application = new Main();
        application.setVisible(true);
        application.pack();
        application.run();
    }
}

 , ,

Ivana
()

Java - неудачная попытка перенести вычисления со стека в кучу

Форум — Development
public class Main {

    private static int sumRec(int n) {return n>0 ? n + sumRec(n-1) : 0;}

    private static class Eval {
        public void sum() {
            if (param>0) {
                Eval e = new Eval (param-1);
                e.sum();
                rezult = param + e.rezult;
            }
            else rezult = 0;
        }
        private int param;
        public int rezult;

        Eval (int n) { param = n; }
    }

    public static void main(String[] args) {
        int n = 10000;
        //System.out.println("recursive : " + sumRec(n));
        Eval e = new Eval (n);
        e.sum();
        System.out.println("trampoline: " + e.rezult);
    }
}

Очевидные замечания, что можно посчитать в цикле или даже вспомнить Карла Фридриховича и посчитать в пару операций прошу не приводить - это все понятно, пример просто ради того, чтобы попробовать технологию, которая потом будет использоваться на нормальных задачах (если будет работать). Выдает переполнение стека. Собственно, почему? Объект через new каждый раз создается в куче, рекурсивных вызовов нет. На что расходуется стек текущего потока?

ЗЫ читал, что можно этот вычислительный объект создавать каждый раз в новом потоке, но мне хотелось бы остаться в одном. К тому же, я не знаю, как Java переварит миллион потоков, к примеру.

 ,

Ivana
()

Java - список активных потоков

Форум — Development

Продолжаю мучить свою программу. У меня Swing GUI интерфейс, в нем запускаю на выполнение разные задачи в отдельных потоках, все по фэн-шую, потоки фоном выполняются (от мгновения до долгого времени), интерфейс живет и не зависает. Хочу сделать на форме динамически самообновляемый список выполняющихся потоков. Сделал, при запуске новой задачи ее поток добавляется в список. Хочу чтобы при окончании сама удалялась из списка - сделал (нашел на стэковерфлоу десяток вариантов). Хочу чтобы по эскейпу выделенная задача прерывалась - сделал, но при этом она не удаляется из списка, видимо прерывается поток не доходя до конца отладочный принт показывает, что до верхнего уровня вызывающей попытки дело не доходит, видимо прерывается с концами где-то посреди внутренних функций. Хорошо, я могу пытаться добиться, чтобы исключение пробрасывалось до верха и удалять текущую задачу из списка. Но есть деление на 0. Хорошо, отловлю и его, но есть переполнение стека (в яве у меня постоянно) и куча других причин, по которым система прибьет поток, а мне не скажет. Я могу получить список активных потоков в любой момент. Могу повесить это дело на таймер и проверять каждую секунду. Но по-моему это криво и должен быть красивый способ. Как запросить у системы универсальный коллбэк при завершении (любом) любого из моих потоков? Готов согласиться даже на Swing Worker с его ограничением в 10 потоков, если только он это умеет их хорошо и удобно администрировать.

 ,

Ivana
()

Java - арифметика над типами - обертками числовых

Форум — Development

Не хотел связываться с Java - но захотел наваять под Андроид, а экзотику Scala|Clojure|Cotlin|C# и т.п. постеснялся, решил попробовать на нативно мейнстримовом языке. Но пока тестирую десктоп вариант, логику. Суть проблемы - у меня есть самописный (хотя не суть) односвязный список с элементами типа Object. Соответственно, числа в нем представлены типами- обертками Double, Integer. Список читаю из строки, заполняется нормально, при чтении определяю нужный тип числа. А дальше, например, мне надо сложить все элементы списка и получить также значение типа Object - Double или Integer. Если в списке у меня значения одного типа - работает нормально, если разных - пишет ошибка, не могу кастовать. Кастую вручную в каждой элементарной операции к более широкому Double - тоже отказывается. Как это победить? В принципе меня даже более чем устроит если будут операции над оберткой Number с автоматическим определением типа результата. Или хотя бы каст к более широкому типу.

 

Ivana
()

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