Фильтрация пайпа с посимвольным чтением
Столкнулся с задачей фильтрации потока, но читая его не построчно, а посимвольно. Поэтому все grep -v, sed, rt не подходят. Собственно, вопрос - есть ли какая готовая утилита или мне писать свою?
Столкнулся с задачей фильтрации потока, но читая его не построчно, а посимвольно. Поэтому все grep -v, sed, rt не подходят. Собственно, вопрос - есть ли какая готовая утилита или мне писать свою?
Жил на Винде-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 & 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.
Здравствуйте.
Я наконец-то морально созрел для установки Убунты на мою Винду 7 (ради Хаскеля). Правильно понимаю, что лучше это сделать через виртуальную машину, а не рядом еще одну ОС и выбирать при старте? Если через виртуалку - то вот здесь http://www.instructables.com/id/Introduction-38/ советуют скачать последнюю Оракловую. Но у меня среди установленных программ есть уже Windows virtual PC. Мне лучше использовать ее, или скачать ту по ссылке? Это одна и та же програама, но скачанная версия будет новее, или это вообще разные производители (Оракл и Майкрософт)? И что тогда ставить? (Куда ставить-то? (С) Добро пожаловать или посторонним вход воспрещен )))))
ЗЫ в одном чатике мне сильно рекомендовали такую штуку, как Vagrant. Говорят, она сильно помогает при работе с виртуалками. Но под него VMWare или Virtual PC или Оракловскую виртуалку - что выбрать?
Простите за возможно дилетантские вопросы, но никогда не сталкивался ни с системами виртуализации, ни с Линуксом. Вариант «снести Винду нахрен и забыть о ней» я знаю, но в моей ситуации он не подходит. Что посоветуете, доктора?
Прикрутил чат-бот интерфейсы к своему эвалюатору. Гиттер: https://gitter.im/liscript/public Слак (надо персонально инвойсы рассылать): https://liscript.slack.com Телеграм: Liscript-bot IRC: куда хочешь
В данный момент задеплоенное на хероке приложение подключено только к гиттеру, можно поиграться там. В велкам-мессадже пара фраз полезной инфы.
Правда, до рисования кругов пока так и не дошли. Но 18-страничный спарринг удался: http://www.cyberforum.ru/oop/thread1905936.html
ЗЫ на dxdy что-то пока не разгорается http://dxdy.ru/topic115224.html Но там нравы суровые, забанят сразу за милую душу! :)
Перемещено tailgunner из development
Есть приложение. Написано собственноручно, ГУИ на Swing, по кнопкам в отдельных потоках запускаются задачки, которые после выполнения выдают в окошки результаты своего выполнения. После написания функционал и интерфейс несколько раз изменялись/расширялись, многие вещи сделаны заплатками, неоптимально, и изначальное отсутствие стройной архитектуры этому только способствовало. Что хочется - на данном конкретном примере продумать и реализовать удобную для масштабирования архитектуру, чтобы потом без особых сверхусилий оставив без изменения классы логики заменить интерфейс на FX например, или вообще прикрутить вэб-интерфейс сначала для локального приложения, а впоследствии сделать полноценное вэб-приложение с публикацией на сайте.
Если есть желающие поменторить и направить в нужном направлении, прошу отписаться в теме или в личке (если она на ЛОРе вообще есть :) ).
Захотел я добавить в свой схемоподобный язык давно лежащую на поверхности идею: вычисления в любом переданном контексте (окружении). Дописал 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)
Собственно, про что тема - подскажите/натолкните на мысль/дайте еще идей на тему, что из этого можно выжать имеющимися средствами или при минимальных допиливаниях.
Не буду писать многабукаф - просто скажите, сколько (по времени в секундах) в 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))
Внезапно столкнулся с вопросом - есть GUI-приложение на Java, и надо добавить функционал кастомизации пользовательских настроек с их запоминанием между вызовами - например, размер шрифтов окон и т.п. Навскидку видится такой вариант - при старте приложение ищет рядом со своим исполняемым файлом файл настроек - пусть он называется «settings.четатам», если он есть - анализирует его, заполняет внутренний объект - таблицу настроек и вызывает функцию (метод) применения этих настроек. Если файла нет, таблица заполняется дефолтными настройками. В самом приложении кнопочка «сетингз», открывающая модальный диалог настроек, при открытии значения в диалоговой форме заполняются из файла (или дефолтными, если файла нет), при сохранении - значения из диалога заполняются в таблицу, сохраняются в файл и вызывается вышеупомянутый метод применения настроек. Вроде все понятно (кроме деталей, которые придется решить по ходу), но решил уточнить:
1) правильна ли сама концепция? 2) в каком формате сохранять файл настроек? Смотреть вшитые/библиотечные методы глубокой сериализации объектов в языке в строку или сразу в файл? А если он будет человеконечитаем - то и фиг бы с ним? Или писать свой велосипед/формат? 3) что еще я не учел/не знаю? Задача, судя по всему, наитипичнейшая и 100500 раз всеми решенная, поэтому думаю, должны быть наработанные стандартные ее решения.
Собственно, сабж. Никогда с вэбом не сталкивался, даже в архитектуре клиент-сервер ничего не писал, с БД не работал, HTML/CSS/Javascript/Php/ и т.п. не умею, опыта вообще ноль. Хочу - чтобы в браузере открывалась страничка с удаленного сервера, я ввожу текст в поле - идет запрос на сервер, и в другое поле выводится ответ или в третье рисуется графический примитив, допустим. через ajax какой-нибудь или что там еще. В перспективе развития - чтобы несколько человек зашло на страницу и при команде от любого ответы приходили всем. Собственно, вопрос - сейчас 100500 модных слов, технологий и фреймворков - что посоветуете для данной задачи? Какой сервер, и т.п. Особых наворотов не надо, платные компоненты также не хочется рассматривать.
Написал я, к примеру, процедуру умножения двух 10-битных чисел (с АЦП приходят такие) в 3 байта результата - для МК у которого нет аппаратного умножения (ATTiny13, в Атмел Студии 6). Проверил на нескольких примерах - работает. Захотел проверить для всего диапазона значений (вполне по силам, всего 10^6 вариантов) - и встрял. На асме могу накидать циклы - но там нет референса с чем сравнивать (умножения то нет). Могу на своем Блабе написать эмулятор этого восьмибитного контроллера, и это даже совсем не сложно, и проверять что угодно... Или можно создать Си-МК-проект, вызвать там мою асм-функцию, передавать ей входные параметры в нужные регистры, и сравнивать с тем, что посчитает компилятор по функции * ? Как это вообще делается?
Организую interpop с java. Все работает, создаю классы методом Class.forName(...), инстансы, нахожу методы и вызываю их с параметрами. Для нахождения методов использую getDeclaredMethod(methodName, paramTypes), в массив параметров типов метода помещаю опять же классы,найденные по имени. Но некоторые методы в качестве параметров принимают типы-примитивы, и передача им Class.forName(«java.lang.Double») напрямую не работает. Работает double.class или Double.TYPE. Но последние варианты неудобно получать из строки - надо заводить отдельную таблицу соответствия строка - примитивный тип. Может есть какой-нибудь удобный метод получения класса типа-примитива из какго-либо строкового представления?
https://github.com/Ivana-/Liscript-GUI-Java-Swing
Если у кого будет желание конструктивно покритиковать, с интересом почитаю. А критиковать там есть что, ибо мне самому не нравится как многое сделано, но как могу на текущий момент.
Делал так (взял откуда-то из инета):
File file = new File(fileAbsolutePath);
String s = new Scanner(file).useDelimiter("\\Z").next();
В 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
Как вообще надо создавать нормальные стандалон-приложения на java?
Господа, это снова я, только не бейте пожалуйста :) И все еще на Swing, да. Потом буду на пробовать JavaFX, честно.
Хочу простого - многострочное текстовое поле с подсветкой синтаксиса собственного языка. По минимуму - выделение цветом ключевых слов, строк внутри кавычек, числовых констант, и подсветка парных скобок от текущего положения курсора. По максимуму - нет предела совершенству Да, реализация пока на Swing - компонентах, потом планируется вариант на JavaFX. Беглый просмотр инета дал 3 общих варианта:
1) Готовые библиотеки где все из коробки. В принципе не против, только смущает их тяжеловесность, наличие ненужного функционала (мне только свой язык подсвечивать). Но зато там бывает и нумерация строк, и подсветка текущей строки, и свертка-развертка по плюсикам и т.п., что интригует. И конечно надо выбрать библиотеку (например, RSyntaxTextArea) и умудриться подключить её к проекту.
2) Свои написания с нуля на JEditorPane, Document и EditorKit.
3) Вариант 2, но на JTextComponent, java.text.AttributedString и еще каких-то непонятных пока компонентах.
Что посоветуете, доктора?
Хотел написать для Андроида, но решил протестировать и доделать рабочий вариант для компа. Первый блин на 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();
}
}
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 переварит миллион потоков, к примеру.
Продолжаю мучить свою программу. У меня Swing GUI интерфейс, в нем запускаю на выполнение разные задачи в отдельных потоках, все по фэн-шую, потоки фоном выполняются (от мгновения до долгого времени), интерфейс живет и не зависает. Хочу сделать на форме динамически самообновляемый список выполняющихся потоков. Сделал, при запуске новой задачи ее поток добавляется в список. Хочу чтобы при окончании сама удалялась из списка - сделал (нашел на стэковерфлоу десяток вариантов). Хочу чтобы по эскейпу выделенная задача прерывалась - сделал, но при этом она не удаляется из списка, видимо прерывается поток не доходя до конца отладочный принт показывает, что до верхнего уровня вызывающей попытки дело не доходит, видимо прерывается с концами где-то посреди внутренних функций. Хорошо, я могу пытаться добиться, чтобы исключение пробрасывалось до верха и удалять текущую задачу из списка. Но есть деление на 0. Хорошо, отловлю и его, но есть переполнение стека (в яве у меня постоянно) и куча других причин, по которым система прибьет поток, а мне не скажет. Я могу получить список активных потоков в любой момент. Могу повесить это дело на таймер и проверять каждую секунду. Но по-моему это криво и должен быть красивый способ. Как запросить у системы универсальный коллбэк при завершении (любом) любого из моих потоков? Готов согласиться даже на Swing Worker с его ограничением в 10 потоков, если только он это умеет их хорошо и удобно администрировать.
Не хотел связываться с Java - но захотел наваять под Андроид, а экзотику Scala|Clojure|Cotlin|C# и т.п. постеснялся, решил попробовать на нативно мейнстримовом языке. Но пока тестирую десктоп вариант, логику. Суть проблемы - у меня есть самописный (хотя не суть) односвязный список с элементами типа Object. Соответственно, числа в нем представлены типами- обертками Double, Integer. Список читаю из строки, заполняется нормально, при чтении определяю нужный тип числа. А дальше, например, мне надо сложить все элементы списка и получить также значение типа Object - Double или Integer. Если в списке у меня значения одного типа - работает нормально, если разных - пишет ошибка, не могу кастовать. Кастую вручную в каждой элементарной операции к более широкому Double - тоже отказывается. Как это победить? В принципе меня даже более чем устроит если будут операции над оберткой Number с автоматическим определением типа результата. Или хотя бы каст к более широкому типу.
следующие → |