2anonymous (*) (2003-04-10 15:23:09.745)
Если верно понял, то делается это на Java просто и гибче. Вот пример:
String comm = new String("xterm -e lftp -c \"mget ftp\://user\:pass\@host/file*\"");
try {
Process proc = Runtime.getRuntime().exec(comm);
InputStream outStream = proc.getInputStream();
InputStream errStream = proc.getErrorStream();
OutputStream inStream = proc.getOutputStream();
// Делаем с потоками все, что заблагорасудится
. . .
} catch (OIExcetion ex) {
System.err.println("ERROR: " + ex.toString());
} // try-catch
По поводу краткой реализации DM5. В начале этого треда уже достаточно обсждали и ставнивали длинну кода разных языков и хорошо это или нет. ИМХО все дело в привычках.
Мне кажется, что хмм.. :)) дискутировать о том как лучше перевести "Thinking Java" на русский язык не стоит. Мне честно говоря это не очень интересно.
Тем не менее я думаю, что почти любой инструмент, глядя на это явление достаточно широко (давай забудем на время про компьютеры и языки программирования) обладает своим внутренним миром, бытием, если угодно "философией". И эта философия невольно, явно или неявно отражается на людях которые его используют, обществе, community. :)). Так же как и взгляд на жизнь человека творческого отражается на его инструментах. Не знаю, стоит ли приводить примеры, но надеюсь быть понятым.
Я не фанат Java. Так же как и не фанат C/C++, Pascal, Perl, /etc. Я почти не знаю Lisp, но даже будучи экспертом по lisp'y и виртуозно им владея, я бы не был фанатом lisp'a, хотя и с большим уважением отношусь к людям его использующим. Это просто инструменты, давай посмотрим дальше и увидим за инструментами решения, а за решениями творчество. Каждый инструмент хорош, возможно даже "прекрасен" для "своих" задач. И, IMHO, спорить о том какой инструмент лучше.. для меня это глупость несусветная - я вовсе не стремлюсь забивать гвозди в синхрофазотрон микроскопом.
Что касается "мягкого и аккуратного". Я искал добротную платформу для разработки корпоративных приложений и нашел то, что мне понравилось - жестко типизированный язык, строгую объектную ориентированность, добротный OOA&D, и весь тот обширный и богатый API, который обзывается J2EE. IMHO, эта платформа все-таки обладает своей внутренней философией.
Опять же насчет МД5 - есть класс MessageDigest, который возвращает массив байт. Из него надо сделать строку. И всего делов. Код на жабе получается угробищный, непонятный и длинный. На любом другом языке (включая сильно нелюбимый мной паскаль) все просто и красиво.
> Опять же насчет МД5 - есть класс MessageDigest, который возвращает
> массив байт. Из него надо сделать строку. И всего делов. Код на жабе
> получается угробищный, непонятный и длинный. На любом другом языке
> (включая сильно нелюбимый мной паскаль) все просто и красиво.
:) Ну так сделайте обертку вокруг этого угробищного, непонятно и длинного кода. Либо расширте класс MessageDigest добавлением метода который будет длля вас возвращать строку.
try { runtime.exec(cmd); }
catch (java.io.IOException e) {System.out.println(e);}
должна работать. Но не работает и даже не собирается. Ладно, смотрим на листинг javac и убираем invalid escape characters. Получается:
Это соберется, но работать не будет. Blackdown JDK 1.1.6, если интересно. Даже могу сказать почему не работает. Потому, что java криво обрабатывает "", подставляемые в exec, а чтобы это обойти нужно извратиться не по детски :)
>:) Ну так сделайте обертку вокруг этого угробищного, непонятно >и длинного кода. Либо расширте класс MessageDigest добавлением >метода который будет длля вас возвращать строку.
Ну я так и сделал (статический класс MD5 со статическим методом md5). Но вместо одного цикла с sprintfом пришлось написать туефу хучу кода. И так всегда с жабой :)
>:) Ну так сделайте обертку вокруг этого угробищного, непонятно >и длинного кода. Либо расширте класс MessageDigest добавлением >метода который будет длля вас возвращать строку.
Ну я так и сделал (статический класс MD5 со статическим методом md5). Но вместо одного цикла с sprintfом пришлось написать туеву хучу кода. И так всегда с жабой :)
>Это переносимо и будет работать в любой кофемолке? (особенно интересуют
> те в корорых shell отсутствует как класс).
А использование exec само по себе уже делает программу слабопереносимой.
О чем SUN предупреждает, да это и так понятно.
>И опять-же поражает ужасающая краткость жабьего кода:
>Runtime.getRuntime().exec vs exec; :)
Зато как понятна команда:
exec();
Вот так, с ходу, скажешь не зная всех тонкостей языка что данная команда делает / может делать? ИМХО вместо того чтобы пладить кучу зарезервированный имен команд удобнее держать их в логически связанных объектах.
Код получается длиннее, но на читабельность это (опять ИМХО) не играет роли.
или признайте, что язык шелловских скриптов имеет громадное преимущество перед языком Java. :)
> Зато как понятна команда:
exec();
А что это?
> Вот так, с ходу, скажешь не зная всех тонкостей языка что данная команда делает / может делать?
Не знаешь (со всеми _нужными_ тонкостями) язык - на фиг его использовать? Тысячи раз уже наверное перетирали про трудности новичков.
> ИМХО вместо того чтобы пладить кучу зарезервированный имен команд удобнее держать их в логически связанных объектах.
Тот, кто плодит кучу "имен команд" наплодит и тучу не связанных логически объектов. Глянь на Qt - хотя это не Java :), но там это (помесь ежа с ужом) проявляется четко.
> Код получается длиннее, но на читабельность это (опять ИМХО) не играет роли.
Читаемость кода, ИМХО, все же зависит от его длины. Выразительность и точность - это _важнейшие_ (опять ИМХО) свойства языка.
> Читаемость кода, ИМХО, все же зависит от его длины.
Конечно зависит, но не _пропорционально_, и зависимость эта зависит от многих факторов.
К примеру следующий код что может делать (и на чем написан)?
let rec insert elt lst =
match lst with
[] -> [elt]
| head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail
let rec sort lst =
match lst with
[] -> []
| head :: tail -> insert head (sort tail)
> К примеру следующий код что может делать (и на чем написан)?
По-моему сортировку :)
По-моему на ocaml :)
Но, даже я слабо знакомый с этими языками (до такой степени, что не знаю что такое match) смог уловить суть, а для человека, _знающего_ этот язык, этот код явно легко читаем. (А трудности новичков - не аргумент).
P.S. Кстати, а почему не захотели напугать меня лиспом или фортом? :)
Вот так решается эта хрень. Мягко говоря, такие извращения при использовании тривиальной операции мог изобрести только человек обладающий каким-то странным воображением, n'est pas ? Самое интересное, что при выводе строки \"Hello, world\", кавычки подставятся правильно, а в exec - кривизна. После этого говорить что jabba язык удобный и логичный несколько неправильно, IMHO.
P.S. Изначальное сообщение с условием было тоже от меня. Пришлось убить половину рабочего дня, чтобы разобраться с этой ерундой. Самое интересное, что главный jabba программер в таких случаях ищет программу, которой можно передавать параметры без "", или пишет костыли на shell. А что совсем убило, так это отсутствие подобного примера _во всех_ книгах по jabba, которые я видел. Даже у O'Relly нет.
2AlexGor - может вашему программисту попробовать следующий
способ ( при слишком громоздких стандартных решениях):
1) Делается оболочка (свой API) - поверх стандартного дабы скрыть
неуклюжесть использования
2) В дальнейшем используется именно он - что даст все
необходимые удобства
Например если мне приходится работать с читым DOM - там,
чтобы получить значение атрибута приходится выполнять 2
операции - я сразу пишу надстройку чтобы делать за одну
операцию. Не стоило убивать на это полдня и ругать на чем
свет стоит яву/ имхо это проблема 5 минут/
>После этого говорить что jabba язык удобный и логичный несколько >неправильно, IMHO.
Тебе же уже пытались объяснить, что java создавалась с учетом максимальной переносимости. Shell(да и ОС в привычном понимании) на многих устройствах, где работает java, отсутствует как класс.
>А что совсем убило, так это отсутствие подобного примера _во всех_ >книгах по jabba, которые я видел.
отсутствие подобного примера свидетельствует только о полном безразличии java-программеров к извращениям с shell ;)
Об exece (в си функция называется spawnl, если мне память не изменяет)
Ну вот, жаба программеры стали сразу отмазываться, что это нахрен никому не нужно :) Тогда вопрос - если это сделали, то кому-то это таки было нужно. Тогда почему сделали криво.
>Например если мне приходится работать с читым DOM - там, чтобы >получить значение атрибута приходится выполнять 2 операции - я >сразу пишу надстройку
Мне совсем непонятно стремление людей которым непонятна/неудобна Java плевать в коллег. Откуда такое неуважение? Если Вас неустраивает конкретный API и руки нормальные, то почему бы потихоньку не нарабатывать собственные пакеты? Почему бы не позаниматься в качестве повышения квалификации OOA&D, выложить в сеть к конце концов. Если что-то на Ваш взляд очень _криво_ - так спросите коллег _вежливо_, думаю здесь найдется достаточно грамотных людей которым несложно ответить.
я понять не могу - что конкретно не нравится? То что аргументы в
exec передаются массивом строк? А ДОЛЖНЫ БЫ ОДНОЙ СТРОКОЙ?????
Хочется чтобы было как чудится и мнится? тогда выход один - писать свое 8) эээ создание .... в смысле язык ...(настоятельно
рекомендую Вам познакомиться с языком D)
потому что со своим уставом с чужого монастыря напинывают 8)
для программистов (имхо) замыслы создателя языка берутся
де факто - и смысла обсуждать почему тут массив а не строка
я не вижу - отправляйте Ваши запросы в bugtrack на java.sun.com
Предлагаю попробовать завести на ЛОРе репозиторий
солюшинов - готовых решений - в частности - что то делается
неочевидными методами = и как это решается. Пример
Задача - вызов внешних процессов в java
Решение - bla bla bla ....
Впоследствии народ сетующий на недостатки / достоинства / баги /
кривизну рук (собственную) / кривизну рук (разработчиков языка) будем направлять на него -
С удовольствием буду пополнять такой список - голосуем?
<quote>
я понять не могу - что конкретно не нравится? То что аргументы в exec передаются массивом строк? А ДОЛЖНЫ БЫ ОДНОЙ СТРОКОЙ?????
</quote>
А почему бы и нет ? К тому же где в доках/книгах/руководствах по jabba написано, что передача параметров в кавычках реализуется _только_ с помощью массива строк ? Примеры как раз идут одной строкой.
<quote>
Предлагаю попробовать завести на ЛОРе репозиторий солюшинов - готовых решений - в частности - что то делается неочевидными методами = и как это решается.
</quote>
Это было бы неплохо. Чтобы можно было программеров туда отсылать, а отвлекают от основной работы :)
2Alter - да - тематичней конечно на JOR а на LOR ссылку кинуть
2AlexGor - 8) не то что бы отвлекаться - обидно бывает - пашешь на
ней пашешь - а потом оказывается что все это суксь потому
что ктото не смог шел пустить - несерьезно как то
Уррра! Поддерживаю идею нолидж бэйза. Предлагаю название на голосование: "Подпорки для Жабы" или "Как реализовать на Жабе тривиальные в других языках вещи".
>я понять не могу - что конкретно не нравится? То что аргументы >в exec передаются массивом строк? А ДОЛЖНЫ БЫ ОДНОЙ >СТРОКОЙ?????
Лично мне не нравиться, что для того что бы посчитать МД5 надо 15 строк кода написать %)
И еще не нравится, что 99% жаба программеров кроме жаюы ничего не знают и не желают знать - и при этом орут, что это единственная возможная вещь для разработки, т.к. (цитирую) "весь мир сча на жабе пишет", "жаба проверена временем", "великолепный язык - с++ отсасывает"...
Я Бетховена не слушал, но считаю, что муйня... (с)
2IceD - извиняюсь за прямоту - это уже похоже но клинику -
разговор слепого с глухим. Вас лично я помещаю в свой black list
(не сочтите за упрямство) - до лучших времен
<quote>
Уррра! Поддерживаю идею нолидж бэйза. Предлагаю название на голосование: "Подпорки для Жабы" или "Как реализовать на Жабе тривиальные в других языках вещи".
</quote>
Эх, все бы постебаться :) А что делать, если начальство и "профессионалы" которым уже ~50 лет и багаж накопленных знаний превращает их в балласт, изначально неправильно выбрали в качестве приоритетной платформы jabba, написана туева хуча софта на этой jabbe и отказаться от него никак нельзя ? Объясню сразу почему нельзя: ЦУП-М, отдел 8203 (телеметрия). Софт в работе. Lead. programmer, который это начал давно свалил, а новое написать - геморрой еще тот.
Поэтому вожусь со старым.
Парадокс состоит в том, что сами jabba программеры трахаются с этой jabb'ой, но ничего другого видеть упорно не хотят, а хотят свалить свои проблемы на далеких от jabba людей. Поэтому было бы неплохо иметь возможность послать их на х... точнее к knoweledge base, и пусть читают себе. Только надо ее на русском делать, потому как английский знает один из пятнадцати, примерно :)
IceD, я бы очень просил Вас чуток перечитать свои посты и немного сменить тон. Пожалуйта, не уподобляйтесь некоторым личностям, которые считают, что можно гадить там же где и есть.
Мне вот только одно непонятно. Вроде есть выбор на чем, о чем, и для кого писать. Я не пишу кофнигураций для 1С, мне сложно с тем языком, но знаю прекрасных профессионалов, которые могут очень быстро и качественно писать под 1С экономические приложения. Кто Вас, IceD лично заставляет писать на Java? Что нет другой работы? Нет других команд, проектов? Или туда не очень то и берут с таким подходом?
>Лично мне не нравиться, что для того что бы посчитать МД5 надо 15
строк кода написать %)
a) купите двуручную клавиатуру, не так дорого она и стоит
b) наследуйте MessageDigest и введите нужные _вам_ методы
c) используйте другой язык программирования..
d) народ продолжите.. плз.
Но пожалуйтса, не пылите...
Извиняюсь за оффтопик: Кто-нибудь использует RH CMS, Portal server ?
Как я тебя понимаю! У меня практически тоже самое. Плюс еще для новых проектов жабу выбирают в основном :( Аргументирую: "У нас нет достаточного количества людей, которые смогут писать на том-же С++"
>Поэтому было бы неплохо иметь возможность послать их на х... >точнее к knoweledge base, и пусть читают себе
>Парадокс состоит в том, что сами jabba программеры трахаются с этой >jabb'ой, но ничего другого видеть упорно не хотят
java-программеры(нормальные) знают сильные и слабые стороны языка и не пытаются решать с его помощью задачи, для которых он не предназначен (интеграция с shell, например).
Section 10.4, paragraph 2: "A pure virtual function need be defined only if explicitly called with the qualified_id syntax ... Note: a function declaration cannot provide both a pure_specifier and a definition."
>видимо просто стоит воспринимать IceD как комический персонаж? 8)
Пожалуйста, мне не жалко :)
2Alter:
>В каких случая чистый виртуальный метод pure virtual method >обязан иметь тело?
Никогда не обязан. Но _может_ иметь, если мы хотим обязать производный класс реализовать данную функцию, но при этом хотим иметь ее базовую версию (что бы тот самый производный класс ее мог использовать). Вроде так.
Встречный вопрос жабопрограммерам (простенький для начала): Как мне правильно проинициализировать скажем статические переменные (ну скажем в классе есть общий для всех экземпляров стрим, и его надо открыть только один раз)? Вопрос номер два: а если у меня статический класс и мне надо статическую же переменную в нем проинициализровать?
Опросил только что наших жабопрограммеров - только один из девяти ответил правильно и сразу :)
2Алл - посоветуйте кто нибудь IceD плз, поюзать шаблоны, в частности синглеты - и научите переменным значения давать -
не то он счас нас всех ... посчитает Ж;)
Следующая стадия разборок с сишниками переходит в область
- у кого шаблонов больше / круче / выше / длинее / а я переменные статические могу инициализировать / а я статические переменные .. / bla bla bla bla ....... bla / a я ......
Чуется мне - нездоровопраздный интерес к яве Ж;) неспроста - иииих неспроста
>Никогда не обязан. Но _может_ иметь, если мы хотим обязать
Саныч :)) Спасибо, но тут даже шпаргалясь больше 2++ не вытягивается. :)))
RTFM !!!
Surely. Consider the following passage from the draft standard of December 2, 1996:
Section 10.4, paragraph 2: "A pure virtual function need be defined only if explicitly called with the qualified_id syntax ... Note: a function declaration cannot provide both a pure_specifier and a definition."
Since the pure virtual destructor will in fact be called explicitly during destruction, this section indicates that it must be defined---not in the declaration, but in a separate definition:
class Cursor {
public:
virtual ~Cursor () = 0;
};
Cursor::~Cursor () { }
I suppose there isn't a whole lot of difference between the two approaches after all. In one, you have to protect all constructors; in the other, you have to define a pure virtual destructor. Pick your nauseant.
Вообще-то pure virtual destructor'у неплохо б иметь тело. :))
Продолжаем разговор (с)...
Мяч в воротах - упрощаем задачу. В каких случаях и для чего обычно используются приватные конструкторы?
Alter: как в каких? когда надо запретить какой-то способ конструирования :)
как-то генерируемый по-умолчанию копирующий конструктор например. или там
разрешить только динамическое создание с помощью предоставленного operator new
HTH
PS. я не IceD и не AlexGor, просто плюсист заглянувший на огонек :)
>просто плюсист заглянувший на огонек :)
Очень мило, весьма рад :)) Ничего не имею против С++, всё только за. Что вы думаете по поводу разгоревшейся дискуссии?
>разрешить только динамическое создание ..
Не совсем понял.. у нас ведь приватный конструктор. Разверните, плз.
IceD - Hint: static methods.
Саныч, прости меня. :))) Только сейчас догнал весь смысл твоего поста.