Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, Roman_M, Вы писали:
R_M>>>>Потребуется как минимум Mac, так как нигде написано про наличие версии этой программы для Windows. PE>>>Нюню. Ты думаешь эксель поддерживает тьлько формат xls ? PE>>>Конвертер написать — два пальца о асфальт. R_M>>То-то и она, что надо писать, а там ведь таблицы, а не просто данные. Если писать, то можно и для Линуксового офиса написать. PE>Обычно на заводе используется одна система. На ней все и крутится.
Так оно обычно и есть, и это не я писал про "другие условия" и "другого директора" и т.п.
R_M>>Так вот если повсеместно в госорганизациях будет Linux, то, естественно, будут и бизнес-приложения под Linux, и документооборот с госучреждениями будет удобно вести используя линуксовые офисы и программы.
PE>А если сейчас везде стоит Винда, то в винде не круто вести документооборот ?
Ведут в Windows, это кстати одна из причин того, почему затруднен переход на официально бесплатный Linux с Windows (который в России тоже бесплатен, но только до первой проверки).
Здравствуйте, Ведмедь, Вы писали:
В>Здравствуйте, Roman_M, Вы писали:
R_M>>Здравствуйте, Sinclair, Вы писали:
R_M>>В эксплорере часто оказывает невозможно сделать много функций, он хорош чтобы показать как круто работать в GUI, но в реальной жизни часто много не хватает. И судя потому, что такая простая вещь, как консольный таск-менеджер, появиласть только в поставке WinXP, то нормального развития эксплорера можно вообще не дождаться.
В>Не хватает так добавь, в чем проблема? Его же можно расширять Как это делает WinRar, например.
Наверное проще будет свой с нуля написать.
Что такое делает WinRar кроме сопоставления расширений файлов себе и добавления в контекстное я что-то не могу припомнить, ну еще drag-n-drop поддерживает.
Здравствуйте, vvaizh, Вы писали:
PE>>Ага. И надо иметь либы для С, С++, Паскаля, Жавы, Питона, Перла, Руби и тд и тд — сколько языков, столько и либ ? Не многовато ли ?
V>формат *.so он для всех языков один.. V>как и формат *.dll в винде..
Я не про это.
V>Так что в перечисленных тобой фзыках V>нужно иметь только враппер, чтобы вызывать оттуда функции (из *.so), V>что давно уже сделано для всех перечисленных тобой языков (да я думаю и раньше OLE тоже..)..
Естественно раньше. OLE-ActiveX-COM решают пролемы, возникающие в использовании ДЛЛ.
V>Ну и чем это удобнее наименования библиотеки и функций в ней?
1. Билиотека и так именуется. Только находиться может где угодно.
2. Функция как таковая не существует. Есть объект и у него есть методы. ООП.
PE>>Если ты пишешь аппликацию, которая сможет работать с разными компонентами, то эти компоненты должны иметь одинаковый внешний программный интерфейс. PE>>Для этого есть средства соответсвующие. V>Как они компоненты идентифицировать будут? V>Как ты свой компонент идентифицировал?
IUnknown везде и всюду одинаков !
V>Что ты мне всё "есть" да "есть"... V>Ты мне напиши, как ты "уже" сделал.. V>А я посмотрю, удобнее это и проще, чем использование функций из библиотек или нет..
У нас используется COM. Тебе должно ыть известны достоинства и недостатки COM по сравнению с ДЛЛ.
PE>>>>Для COM это все не надо. Даже имени длл. V>>>А как же ты компонент проидентифицируешь? PE>>"Word.Application" PE>>"Excel.Application" V>Стоп.. V>Вот ты перечислил 2 системы.. V>Из твоей речи выше я так понял что есть 1!!!!!! компонент, который используется всеми остальными.. V>Но ты почему то используешь не его, а что то другое (ворд) V>Этого компонента нет? V>Или он в ворде и ексель свой? V>Чего ты мне чепуху то городишь.. V>Назови компонент, который используется в 10-ит системах, и который 1!
MSXML, WebBrowser, MSHTML
V>И как ты его идентифицируешь..
V>Я рад, жалко только что не твои плагины не всегда работают.. PE>>Не нужно никаких врапперов. V>Ну и какой C++ класс у тебя создаётся? V>Тоже апишный?
Я даже не знаю, класс ли это. АПИ возвращает указатель на интейфейс IUnknown.
V>>>>>Для JS ? V>>>Аналогично V>>>CreateObject — это и есть wrapper OLE для JS.. PE>>CreateObject — это враппер для АПИ функции CoCreateInstance и только. PE>>JS сам умеет работать с COM. V>JS — сам по себе большой враппер, а не язык, своих собственных средств у V>него очень мало, он как и vbs язык специально заточенный MS под COM.. V>(по крайней мере то, что в Win называется JS..)
В точку. Но это не враппер, а язык. Библиотека ему не нужна — она уже есть в самом Ворде, экселе и тд.
PE>>>>Я ком юзал из С и Asm. Врапперов нет. Дядя, не смеши. Ты COM — я уверен — не знаешь. Без обид. V>>> V>>>Я чувствую, что ты так думаешь.. V>>>Жаль тебя разочаровывать, но пару/тройку ком компонентов я написал, а сколько V>>>использовал, вообще считать страшно.. PE>>Я понимаю тебя. Я по большому счету ничего не писал, кроме COM компонентов и тд. V>А ну тогда всё понятно.. V>Узкий специалист подобен флюсу — полнота его односторонняя V> (с) Козьма Прутков V>Тебе видимо просто не с чем сравнивать.. V>Так что ты меня всё таки не понимаешь..
Мне есть с чем сравнивать. ДЛЛ — это уровень С. COM — это уровень С++, JS, ObjPascal и тд (ООП).
V>Вот тогда прокомментируй высказывание, что минимальный объём проги использующий чистый С — OLE — 2000 V>строк.. В отличие от ispell, который можно использовать вызовом нескольких строчек.. V>И уж тем более, в asm..
Ну ты даешь. Что делает прога в 2000 строк ?
Вот минимальная прога
А чуть ниже я еще прожку подкинул
PE>>OLE — это старое понятие. OLE были в основном в ДЛЛ. Сейчас это не так. Ты же не только спелчекеры используешь.
V>Ну COM, какая разница.. Ты мне всё таки объясни, преимущества использования спеллчеккера через COM. V>Про то что попадает в описанные мною 4 пункта, не нужна, для таких компонентов преимущества я знаю.
Использование спеллчекера не нужно делать чз COM если ты его сам пишешь.
Но если мне нужно использовать готовый, чтобы время с экономить ?
Именно, и я думал, это общепринято..
PE>Распространяется обычно бинарник и tlb в одном флаконе. все генерируется автоматом.
Да, автоматом — это круто..
Но — не нужно если этот самый *.h уже есть, как и все исходники..
PE>Если ты не используешь COM, как тебе получить заголовок и библиотеку для языка например Pascal ? PE>На сайте разработчика только для C/C++ есть. Что удешь делать ? Ничего. Искать другую.
Сгенерируй мне wrapper для паскаля..
И, кстати для какого ещё непонятно..
И потом для других языков конвертилок *.h-> в них тоже до фига..
Хотя я в принципе с тобой согласен, что idl баще конвертилок из *.h файла..
Но.. опять же в случае ispell, все wrapper-ы уже есть..
Хотя... наличие tlb-файла конечно шаг вперёд..
А idl формат он не OLE-шный, он общий (в CORBA такой же)..
Так что при необходимости, и на linux его вполно испльзуют..
А для ispell он не нужен опять же повторяю, потому, что
родных врапперов для всех языков навалом..
PE>По этой причине ZLib распространяется с необходимыми файлами для ВСЕХ языков. PE>Для питона и перла она продублирована на 100% PE>Ты можешь дать гарантию, что тот, кто писал ZLib для питона, PE>не ошибся ни разу или совершил теже ошибки, что есть в варианте С/С++ ? PE>И не только ZLib.
ZLib — один на всех..
на языках только врапперы..
Или ты серъёзно думаешь, что кто то запускает такие долгоиграющие вещи, как сжатие данных на интерпретируемых языках..
Ты глубоко заблуждаешься..
PE>В QT для Pascal чтобы не дублировать код, пришлось писать РУКАМИ врапперы, которые просто перенаправляют вызовы в QT для C/C++.
Ага... MFC вот тоже класса QT.. я что то не слышал, чтобы она на OLE была основана..
И вообще что она на паскале есть.. Хоть с врапперами, хоть без врапперов..
PE>В COM такого нет !
Дык и Попуоярной оконной библиотеки, основанной на COM нет..
PE>>>Мну нужно PE>>>или 7 разных компонент PE>>>или 1 компонента и 7 библиотек V>>Нет, тебе нужен 1 компонент, а во всех языках врапперы для него.. PE>Значит 7 врапперов по твоему ?
А что, по твоему не 7?
V>>Точто так же как и для OLE.. PE>Какой враппер для OLE нужен ? Что это такое ? CComPtr ?
Не он сам, а то что у него в скобках <>
А сам он — тоже wrapper, но только не для spellchecker-а а для OLE..
PE>COM — это враппер сам для себя ! IDL — это COM, а не враппер.
IDL — это международный стандарт..
Он и в CORBA используется..
PE>>>или 1 компонента, которая свободно, без врапперов, подымается из любого языка. V>>Вот список врапперов, которые ты используешь: V>>1. "голый" OLE на С PE>Какой же это враппер ? Я вызываю функцию АПИ напрямую и получаю указатель на структуру из указателей. PE>Где врапперы ?
API чего? Ядра? Стандартной библиотеки C?
какая либа подключается? Вот эта либа и враппер..
V>>2. библиотека на C++ для него PE>Что такое библиотека С++ для него ?
Представляющая для удобства "чистый" C-OLE в виде классов
Что там ты используешь..
MFC, ATL, что то другое?
Если используешь конечно..
V>>3. заголовок, созданный из tlb-файла, или не знаю как ты его там создал.. PE>Это генерируется по tlb и выглядит одинаково для всех библиотек во всех языках.
Кто? заголовок? А... Вспомнил..
Ты про слово import наверно..
А оно точно входит в стандарт C++?
Уж не говоря о том, чтобы idl входил в остав других языков..
PE>Это не врапперы — это просто заголовки. Вот для Питона и Перла нужны врапперы. Они не умеют с COM работать.
Для C++ они тоже нужны.. это всё таки стандартизованный язык..
И MSVС имеет к нему отнрошение (по планам MS будет иметь, к не помню какому году.. только на 95%)
PE>Враппер — COleDispatchDriver СPictureHolder COleStreamFile PE>Посмотри, пожалуйста, на эти врапперы и сравни с интерфейсами соответсвующими.
Я что то должен увидеть?
Ты пальцем покажи..
Я пока что вижу, что врапперы есть..
как должны они быть и для
Здравствуйте, m.a.g., Вы писали:
MAG>Здравствуйте, Roman_M, Вы писали:
S>>>Очень хороший пример. В качестве замены команде dir MS предлагает диалог поиска файлов. В принципе, это хорошая и последовательная замена, поскольку R_M>>Конечно уже давно пришло время заменить командную строку на GUI-интерфейс, но замена все таки не очень хорошая.
MAG>Скорее, "командную строку дополнить чем-нибудь еще". Я еще раз отсылаю к The anti-mac interface по поводу невозможности полной отмены командной строки. Честно скажу, эта статья очень сильно изменяет сознание По крайней мере, его эманации, связанные с фразой "консоль отстой".
Я затрудняюсь сказать как именно делать правильно, но то что в эксплорере нехватает функций командной строки — факт. Другое дело, что изучение команд не должно быть обязательным, консоль должна использоваться тогда, когда в этом есть реальная необходимость. То есть те, кому хочется большего могут поработать с использованием дополнительных возможностей, те кому обломно разбираться могут туда не лезть. M$, вероятно, же решила отлучить народ от консоли накорню.
S>>>1. она позволяет даже неумелому пользователю использовать достаточно сложные условия для этого поиска (попробуйте в с помощью той же dir дополнительно ограничить файлы теми, которые были модифицированы в течение последней недели) R_M>>В Linux консольные программы развиты гораздо лучше, консоль на уровне MS-DOS конечно же не очень приспособлена для таках вещей. С тем что работа в консоле Windows ужасна и спорить нечего.
MAG>Честно говоря, идеальный find мне видится таким:
MAG>
MAG>есть find. консольный. ничем не отличающийся от юниксового. MAG>есть гуй. который использует консольный find в качестве backend MAG>
Мне тоже так кажется.
MAG>Вариант — это две морды над одной библиотекой. Библиотеку разрешается сделать COM-компонентом. Библиотеку и консольную морду пишут юниксоиды, гуевую — виндузятники. Никто не обижен. У всех есть привычные фишки. Дублирования кода нет. Ляпота. Только никогда этого не будет...
Вот это похоже на правду, это же так офигительно трудно реализовать.
R_M>>Ну в голой командной строке тоже не часто работают, её уже давно используют как вспомогательный инструмент, а все базовые операции делаются на какой-нибудь оболочке типа far, dn, mc, nc. MAG>В винде — да, из-за убогости консоли. А вот в линуксе bash будет помощнее cmd.
Бесспорно помощнее, но все равно удобней использовать mc, чем только одну командную строку.
Здравствуйте, mihailik, Вы писали:
MAG>> cron придуман был невесть когда и до сих пор успешно работает. А в винде... M>Нет, это в Линуксе кругом сакс, а а Windows NT шедулер с самого начала.
"Вынь скас, вынь сакс" — кричали, а что такое "сакс" и откуда его вынимать никто так и не сказал.
Здравствуйте, Ведмедь, Вы писали:
В>Здравствуйте, vvaizh, Вы писали:
V>>ага, и построишь на её основе выскокоточный взрыватель... Так и вижу компоненты выскоких технологий, а в качестве инициирующего V>>эелемента — твоя лицензированная зажигалка, и механический палец для нажатия на кнопочку..
V>>Это то же самое, что использовать ворд дл япроверки орфографии в своей программе ..
В>Ты знаешь, есть проверка в Ворде, офис стоит. Я так понял ты в таком случае будешь искать где то ОТДЕЛЬНЫЙ компонент проверки. То есть у тебя будет стоять ДВА компонентя для одного и того же? Прекрасное решение!
Я вот в курсе, что оффис при установке поднимает целую толпу OLE-компонентов..
И скорее всего среди них есть тот, который нам нужен..
То, что вы вместо его поиска пользуете весь ворд, не есть хорошо..
В>Но лучше иметь зажигалку , чем каждый раз трением добывать огонь. Или связывать что то скочем, что бы не развалилось.
V>>Хотя наверно все не так смешно — а грустно, так как вся твоя система построена из таких деталек, так что зажигалка даже в глаза не бросается.. А там где деталек нет, у тебя пластилин... Супер... V>>А потом МS выпускает новую версию своей "зажигалки" более прогрессивный, и ты свою конструкцию разбираешь снова, раздепляешь пластилин, ставишь новую зажигалку, тестируешь...
В>Какая у тебюя фантазия. ЗАчем? Ну вышла новая версия Ворда, меня то как она касается, все и так все работает давно. Если клиент хочет, то ставит новую версию ворда. и с НЕЙ ТОЖЕ БУДЕТ ВСЕ РАБОТАТЬ.
Если только они эту штуку не перепишут на .NET, а старый COM объект не выкинут за ненадобностью..
Или интерфейс сильно переделают..
И то и другое не кажется мне таким уж невероятным..
V>>А те, у кого нет твоих исходников, но которые уже успели купить твою прогу, курят.. V>>Или платят тебе за ановую версию
В>Ты знаешь, когда что то ставят заказчику, то должно все работать, и никакой заказчик не будет разбираться в твоих исходных кодах, они ему не нужны. Ему нужен рабочий продукт. причем быстро и качественно. И чем здесь могут помочь ему исходники я понять не могу. Только не надо сказок про "исправить и подправить". Этим должны заниматься разработчики. но ни как не заказчик.
Конечно, при сдаче они ему не нужны..
Вот только если ворда у него случайно стоять не будет, то придётся объяснять ему, что не так..
И прописывать ворд в ТЗ сразу.. И версию его тоже..
В>Знаешь когда заказывают новую версию? Нет? Почитай что-нибудь этому посвяшенное. Новую весрию заказывают тогда, когда не хватает старой и разработка ( покупка ) новой окупится. Это никак не связано с выходом новой версии Ворда. А вот скорость и модульность важна.
Ну как не связано то..
Поставят они себе новый ворд.. А орфография в вашей системе с ним и не подружится..
Здравствуйте, vvaizh, Вы писали:
PE>>Распространяется обычно бинарник и tlb в одном флаконе. все генерируется автоматом. V>Да, автоматом — это круто.. V>Но — не нужно если этот самый *.h уже есть, как и все исходники..
Для какого языка ?
PE>>Если ты не используешь COM, как тебе получить заголовок и библиотеку для языка например Pascal ? PE>>На сайте разработчика только для C/C++ есть. Что удешь делать ? Ничего. Искать другую. V>Сгенерируй мне wrapper для паскаля..
В дельфях есть свой Midl. Юзай его.
V>И, кстати для какого ещё непонятно.. V>И потом для других языков конвертилок *.h-> в них тоже до фига.. V>Хотя я в принципе с тобой согласен, что idl баще конвертилок из *.h файла.. V>Но.. опять же в случае ispell, все wrapper-ы уже есть..
V>Хотя... наличие tlb-файла конечно шаг вперёд.. V>А idl формат он не OLE-шный, он общий (в CORBA такой же).. V>Так что при необходимости, и на linux его вполно испльзуют.. V>А для ispell он не нужен опять же повторяю, потому, что V>родных врапперов для всех языков навалом..
PE>>По этой причине ZLib распространяется с необходимыми файлами для ВСЕХ языков. PE>>Для питона и перла она продублирована на 100% PE>>Ты можешь дать гарантию, что тот, кто писал ZLib для питона, PE>>не ошибся ни разу или совершил теже ошибки, что есть в варианте С/С++ ? PE>>И не только ZLib. V>ZLib — один на всех.. V>на языках только врапперы.. V>Или ты серъёзно думаешь, что кто то запускает такие долгоиграющие вещи, как сжатие данных на интерпретируемых языках.. V>Ты глубоко заблуждаешься..
Смотри ниже — один из файликов. Такое количесвто кода никому не надо. Где гарантии, что ошибок нет ?
PE>>В QT для Pascal чтобы не дублировать код, пришлось писать РУКАМИ врапперы, которые просто перенаправляют вызовы в QT для C/C++. V>Ага... MFC вот тоже класса QT.. я что то не слышал, чтобы она на OLE была основана.. V>И вообще что она на паскале есть.. Хоть с врапперами, хоть без врапперов..
MFC — именно С++ билиотека для всего. А как писать для KDE на разных языках ?
PE>>В COM такого нет ! V>Дык и Попуоярной оконной библиотеки, основанной на COM нет..
Винда — это 75% COM.
V>>>Нет, тебе нужен 1 компонент, а во всех языках врапперы для него.. PE>>Значит 7 врапперов по твоему ? V>А что, по твоему не 7?
V>>>Точто так же как и для OLE.. PE>>Какой враппер для OLE нужен ? Что это такое ? CComPtr ? V>Не он сам, а то что у него в скобках <> V>А сам он — тоже wrapper, но только не для spellchecker-а а для OLE..
CComPtr — враппер для указателя, а не для OLE.
PE>>COM — это враппер сам для себя ! IDL — это COM, а не враппер. V>IDL — это международный стандарт.. V>Он и в CORBA используется..
PE>>>>или 1 компонента, которая свободно, без врапперов, подымается из любого языка. V>>>Вот список врапперов, которые ты используешь: V>>>1. "голый" OLE на С PE>>Какой же это враппер ? Я вызываю функцию АПИ напрямую и получаю указатель на структуру из указателей. PE>>Где врапперы ? V>API чего? Ядра? Стандартной библиотеки C? V>какая либа подключается? Вот эта либа и враппер..
В WINAPI есть фунцыя — CoCreateInstance
Сразу загружается оъект. Врапперы здесь нахрен не нужны.
V>>>2. библиотека на C++ для него PE>>Что такое библиотека С++ для него ? V>Представляющая для удобства "чистый" C-OLE в виде классов
Не надо такое. Есть интерфейсы и все.
V>Что там ты используешь.. V>MFC, ATL, что то другое?
Я тоьлко ATL для сервера. А как клиент мне это не надо.
V>>>3. заголовок, созданный из tlb-файла, или не знаю как ты его там создал.. PE>>Это генерируется по tlb и выглядит одинаково для всех библиотек во всех языках. V>Кто? заголовок? А... Вспомнил.. V>Ты про слово import наверно.. V>А оно точно входит в стандарт C++? V>Уж не говоря о том, чтобы idl входил в остав других языков..
PE>>Это не врапперы — это просто заголовки. Вот для Питона и Перла нужны врапперы. Они не умеют с COM работать. V>Для C++ они тоже нужны.. это всё таки стандартизованный язык.. V>И MSVС имеет к нему отнрошение (по планам MS будет иметь, к не помню какому году.. только на 95%)
PE>>Враппер — COleDispatchDriver СPictureHolder COleStreamFile PE>>Посмотри, пожалуйста, на эти врапперы и сравни с интерфейсами соответсвующими. V>Я что то должен увидеть? V>Ты пальцем покажи.. V>Я пока что вижу, что врапперы есть.. V>как должны они быть и для
Эти врапперы не нужны. Они лишь для твоего удобства.
Вот ез чего невозможно юзать ZLib в Питоне. Кода немеряно.
"Read and write ZIP files."
# Written by James C. Ahlstrom jim@interet.com
# All rights transferred to CNRI pursuant to the Python contribution agreement
import struct, os, time
import binascii
try:
import zlib # We may need its compression method
except ImportError:
zlib = None
__all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
"ZipInfo", "ZipFile", "PyZipFile"]
class BadZipfile(Exception):
pass
error = BadZipfile # The exception raised by this module
# constants for Zip file compression methods
ZIP_STORED = 0
ZIP_DEFLATED = 8
# Other ZIP compression methods not supported
# Here are some struct module formats for reading headers
structEndArchive = "<4s4H2lH" # 9 items, end of archive, 22 bytes
stringEndArchive = "PK\005\006" # magic number for end of archive record
structCentralDir = "<4s4B4H3l5H2l"# 19 items, central directory, 46 bytes
stringCentralDir = "PK\001\002" # magic number for central directory
structFileHeader = "<4s2B4H3l2H" # 12 items, file header record, 30 bytes
stringFileHeader = "PK\003\004" # magic number for file header
# indexes of entries in the central directory structure
_CD_SIGNATURE = 0
_CD_CREATE_VERSION = 1
_CD_CREATE_SYSTEM = 2
_CD_EXTRACT_VERSION = 3
_CD_EXTRACT_SYSTEM = 4 # is this meaningful?
_CD_FLAG_BITS = 5
_CD_COMPRESS_TYPE = 6
_CD_TIME = 7
_CD_DATE = 8
_CD_CRC = 9
_CD_COMPRESSED_SIZE = 10
_CD_UNCOMPRESSED_SIZE = 11
_CD_FILENAME_LENGTH = 12
_CD_EXTRA_FIELD_LENGTH = 13
_CD_COMMENT_LENGTH = 14
_CD_DISK_NUMBER_START = 15
_CD_INTERNAL_FILE_ATTRIBUTES = 16
_CD_EXTERNAL_FILE_ATTRIBUTES = 17
_CD_LOCAL_HEADER_OFFSET = 18
# indexes of entries in the local file header structure
_FH_SIGNATURE = 0
_FH_EXTRACT_VERSION = 1
_FH_EXTRACT_SYSTEM = 2 # is this meaningful?
_FH_GENERAL_PURPOSE_FLAG_BITS = 3
_FH_COMPRESSION_METHOD = 4
_FH_LAST_MOD_TIME = 5
_FH_LAST_MOD_DATE = 6
_FH_CRC = 7
_FH_COMPRESSED_SIZE = 8
_FH_UNCOMPRESSED_SIZE = 9
_FH_FILENAME_LENGTH = 10
_FH_EXTRA_FIELD_LENGTH = 11
# Used to compare file passed to ZipFile
import types
_STRING_TYPES = (types.StringType,)
if hasattr(types, "UnicodeType"):
_STRING_TYPES = _STRING_TYPES + (types.UnicodeType,)
def is_zipfile(filename):
"""Quickly see if file is a ZIP file by checking the magic number.
Will not accept a ZIP archive with an ending comment.
"""
try:
fpin = open(filename, "rb")
fpin.seek(-22, 2) # Seek to end-of-file record
endrec = fpin.read()
fpin.close()
if endrec[0:4] == "PK\005\006" and endrec[-2:] == "\000\000":
return 1 # file has correct magic number
except IOError:
pass
class ZipInfo:
"""Class with attributes describing each file in the ZIP archive."""
def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
self.filename = _normpath(filename) # Name of the file in the archive
self.date_time = date_time # year, month, day, hour, min, sec
# Standard values:
self.compress_type = ZIP_STORED # Type of compression for the file
self.comment = "" # Comment for each file
self.extra = "" # ZIP extra data
self.create_system = 0 # System which created ZIP archive
self.create_version = 20 # Version which created ZIP archive
self.extract_version = 20 # Version needed to extract archive
self.reserved = 0 # Must be zero
self.flag_bits = 0 # ZIP flag bits
self.volume = 0 # Volume number of file header
self.internal_attr = 0 # Internal attributes
self.external_attr = 0 # External file attributes
# Other attributes are set by class ZipFile:
# header_offset Byte offset to the file header
# file_offset Byte offset to the start of the file data
# CRC CRC-32 of the uncompressed file
# compress_size Size of the compressed file
# file_size Size of the uncompressed file
def FileHeader(self):
"""Return the per-file header as a string."""
dt = self.date_time
dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
if self.flag_bits & 0x08:
# Set these to zero because we write them after the file data
CRC = compress_size = file_size = 0
else:
CRC = self.CRC
compress_size = self.compress_size
file_size = self.file_size
header = struct.pack(structFileHeader, stringFileHeader,
self.extract_version, self.reserved, self.flag_bits,
self.compress_type, dostime, dosdate, CRC,
compress_size, file_size,
len(self.filename), len(self.extra))
return header + self.filename + self.extra
# This is used to ensure paths in generated ZIP files always use
# forward slashes as the directory separator, as required by the
# ZIP format specification.
if os.sep != "/":
def _normpath(path):
return path.replace(os.sep, "/")
else:
def _normpath(path):
return path
class ZipFile:
""" Class with methods to open, read, write, close, list zip files.
z = ZipFile(file, mode="r", compression=ZIP_STORED)
file: Either the path to the file, or a file-like object.
If it is a path, the file will be opened and closed by ZipFile.
mode: The mode can be either read "r", write "w" or append "a".
compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
"""
fp = None # Set here since __del__ checks it
def __init__(self, file, mode="r", compression=ZIP_STORED):
"""Open the ZIP file with mode read "r", write "w" or append "a"."""
if compression == ZIP_STORED:
pass
elif compression == ZIP_DEFLATED:
if not zlib:
raise RuntimeError,\
"Compression requires the (missing) zlib module"
else:
raise RuntimeError, "That compression method is not supported"
self.debug = 0 # Level of printing: 0 through 3
self.NameToInfo = {} # Find file info given name
self.filelist = [] # List of ZipInfo instances for archive
self.compression = compression # Method of compression
self.mode = key = mode[0]
# Check if we were passed a file-like object
if type(file) in _STRING_TYPES:
self._filePassed = 0
self.filename = file
modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
self.fp = open(file, modeDict[mode])
else:
self._filePassed = 1
self.fp = file
self.filename = getattr(file, 'name', None)
if key == 'r':
self._GetContents()
elif key == 'w':
pass
elif key == 'a':
fp = self.fp
fp.seek(-22, 2) # Seek to end-of-file record
endrec = fp.read()
if endrec[0:4] == stringEndArchive and \
endrec[-2:] == "\000\000":
self._GetContents() # file is a zip file
# seek to start of directory and overwrite
fp.seek(self.start_dir, 0)
else: # file is not a zip file, just append
fp.seek(0, 2)
else:
if not self._filePassed:
self.fp.close()
self.fp = None
raise RuntimeError, 'Mode must be "r", "w" or "a"'
def _GetContents(self):
"""Read the directory, making sure we close the file if the format
is bad."""
try:
self._RealGetContents()
except BadZipfile:
if not self._filePassed:
self.fp.close()
self.fp = None
raise
def _RealGetContents(self):
"""Read in the table of contents for the ZIP file."""
fp = self.fp
fp.seek(-22, 2) # Start of end-of-archive record
filesize = fp.tell() + 22 # Get file size
endrec = fp.read(22) # Archive must not end with a comment!
if endrec[0:4] != stringEndArchive or endrec[-2:] != "\000\000":
raise BadZipfile, "File is not a zip file, or ends with a comment"
endrec = struct.unpack(structEndArchive, endrec)
if self.debug > 1:
print endrec
size_cd = endrec[5] # bytes in central directory
offset_cd = endrec[6] # offset of central directory
x = filesize - 22 - size_cd
# "concat" is zero, unless zip was concatenated to another file
concat = x - offset_cd
if self.debug > 2:
print "given, inferred, offset", offset_cd, x, concat
# self.start_dir: Position of start of central directory
self.start_dir = offset_cd + concat
fp.seek(self.start_dir, 0)
total = 0
while total < size_cd:
centdir = fp.read(46)
total = total + 46
if centdir[0:4] != stringCentralDir:
raise BadZipfile, "Bad magic number for central directory"
centdir = struct.unpack(structCentralDir, centdir)
if self.debug > 2:
print centdir
filename = fp.read(centdir[_CD_FILENAME_LENGTH])
# Create ZipInfo instance to store file information
x = ZipInfo(filename)
x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
total = (total + centdir[_CD_FILENAME_LENGTH]
+ centdir[_CD_EXTRA_FIELD_LENGTH]
+ centdir[_CD_COMMENT_LENGTH])
x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET] + concat
# file_offset must be computed below...
(x.create_version, x.create_system, x.extract_version, x.reserved,
x.flag_bits, x.compress_type, t, d,
x.CRC, x.compress_size, x.file_size) = centdir[1:12]
x.volume, x.internal_attr, x.external_attr = centdir[15:18]
# Convert date/time code to (year, month, day, hour, min, sec)
x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )
self.filelist.append(x)
self.NameToInfo[x.filename] = x
if self.debug > 2:
print "total", total
for data in self.filelist:
fp.seek(data.header_offset, 0)
fheader = fp.read(30)
if fheader[0:4] != stringFileHeader:
raise BadZipfile, "Bad magic number for file header"
fheader = struct.unpack(structFileHeader, fheader)
# file_offset is computed here, since the extra field for
# the central directory and for the local file header
# refer to different fields, and they can have different
# lengths
data.file_offset = (data.header_offset + 30
+ fheader[_FH_FILENAME_LENGTH]
+ fheader[_FH_EXTRA_FIELD_LENGTH])
fname = fp.read(fheader[_FH_FILENAME_LENGTH])
if fname != data.filename:
raise RuntimeError, \
'File name in directory "%s" and header "%s" differ.' % (
data.filename, fname)
def namelist(self):
"""Return a list of file names in the archive."""
l = []
for data in self.filelist:
l.append(data.filename)
return l
def infolist(self):
"""Return a list of class ZipInfo instances for files in the
archive."""
return self.filelist
def printdir(self):
"""Print a table of contents for the zip file."""
print "%-46s %19s %12s" % ("File Name", "Modified ", "Size")
for zinfo in self.filelist:
date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time
print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)
def testzip(self):
"""Read all the files and check the CRC."""
for zinfo in self.filelist:
try:
self.read(zinfo.filename) # Check CRC-32
except:
return zinfo.filename
def getinfo(self, name):
"""Return the instance of ZipInfo given 'name'."""
return self.NameToInfo[name]
def read(self, name):
"""Return file bytes (as a string) for name."""
if self.mode not in ("r", "a"):
raise RuntimeError, 'read() requires mode "r" or "a"'
if not self.fp:
raise RuntimeError, \
"Attempt to read ZIP archive that was already closed"
zinfo = self.getinfo(name)
filepos = self.fp.tell()
self.fp.seek(zinfo.file_offset, 0)
bytes = self.fp.read(zinfo.compress_size)
self.fp.seek(filepos, 0)
if zinfo.compress_type == ZIP_STORED:
pass
elif zinfo.compress_type == ZIP_DEFLATED:
if not zlib:
raise RuntimeError, \
"De-compression requires the (missing) zlib module"
# zlib compress/decompress code by Jeremy Hylton of CNRI
dc = zlib.decompressobj(-15)
bytes = dc.decompress(bytes)
# need to feed in unused pad byte so that zlib won't choke
ex = dc.decompress('Z') + dc.flush()
if ex:
bytes = bytes + ex
else:
raise BadZipfile, \
"Unsupported compression method %d for file %s" % \
(zinfo.compress_type, name)
crc = binascii.crc32(bytes)
if crc != zinfo.CRC:
raise BadZipfile, "Bad CRC-32 for file %s" % name
return bytes
def _writecheck(self, zinfo):
"""Check for errors before writing a file to the archive."""
if self.NameToInfo.has_key(zinfo.filename):
if self.debug: # Warning for duplicate names
print "Duplicate name:", zinfo.filename
if self.mode not in ("w", "a"):
raise RuntimeError, 'write() requires mode "w" or "a"'
if not self.fp:
raise RuntimeError, \
"Attempt to write ZIP archive that was already closed"
if zinfo.compress_type == ZIP_DEFLATED and not zlib:
raise RuntimeError, \
"Compression requires the (missing) zlib module"
if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
raise RuntimeError, \
"That compression method is not supported"
def write(self, filename, arcname=None, compress_type=None):
"""Put the bytes from filename into the archive under the name
arcname."""
st = os.stat(filename)
mtime = time.localtime(st[8])
date_time = mtime[0:6]
# Create ZipInfo instance to store file information
if arcname is None:
zinfo = ZipInfo(filename, date_time)
else:
zinfo = ZipInfo(arcname, date_time)
zinfo.external_attr = st[0] << 16 # Unix attributes
if compress_type is None:
zinfo.compress_type = self.compression
else:
zinfo.compress_type = compress_type
self._writecheck(zinfo)
fp = open(filename, "rb")
zinfo.flag_bits = 0x00
zinfo.header_offset = self.fp.tell() # Start of header bytes
# Must overwrite CRC and sizes with correct data later
zinfo.CRC = CRC = 0
zinfo.compress_size = compress_size = 0
zinfo.file_size = file_size = 0
self.fp.write(zinfo.FileHeader())
zinfo.file_offset = self.fp.tell() # Start of file bytes
if zinfo.compress_type == ZIP_DEFLATED:
cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15)
else:
cmpr = None
while 1:
buf = fp.read(1024 * 8)
if not buf:
break
file_size = file_size + len(buf)
CRC = binascii.crc32(buf, CRC)
if cmpr:
buf = cmpr.compress(buf)
compress_size = compress_size + len(buf)
self.fp.write(buf)
fp.close()
if cmpr:
buf = cmpr.flush()
compress_size = compress_size + len(buf)
self.fp.write(buf)
zinfo.compress_size = compress_size
else:
zinfo.compress_size = file_size
zinfo.CRC = CRC
zinfo.file_size = file_size
# Seek backwards and write CRC and file sizes
position = self.fp.tell() # Preserve current position in file
self.fp.seek(zinfo.header_offset + 14, 0)
self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size,
zinfo.file_size))
self.fp.seek(position, 0)
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
def writestr(self, zinfo, bytes):
"""Write a file into the archive. The contents is the string
'bytes'."""
self._writecheck(zinfo)
zinfo.file_size = len(bytes) # Uncompressed size
zinfo.CRC = binascii.crc32(bytes) # CRC-32 checksum
if zinfo.compress_type == ZIP_DEFLATED:
co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15)
bytes = co.compress(bytes) + co.flush()
zinfo.compress_size = len(bytes) # Compressed size
else:
zinfo.compress_size = zinfo.file_size
zinfo.header_offset = self.fp.tell() # Start of header bytes
self.fp.write(zinfo.FileHeader())
zinfo.file_offset = self.fp.tell() # Start of file bytes
self.fp.write(bytes)
if zinfo.flag_bits & 0x08:
# Write CRC and file sizes after the file data
self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size,
zinfo.file_size))
self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo
def __del__(self):
"""Call the "close()" method in case the user forgot."""
self.close()
def close(self):
"""Close the file, and for mode "w" and "a" write the ending
records."""
if self.fp is None:
return
if self.mode in ("w", "a"): # write ending records
count = 0
pos1 = self.fp.tell()
for zinfo in self.filelist: # write central directory
count = count + 1
dt = zinfo.date_time
dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
centdir = struct.pack(structCentralDir,
stringCentralDir, zinfo.create_version,
zinfo.create_system, zinfo.extract_version, zinfo.reserved,
zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
zinfo.CRC, zinfo.compress_size, zinfo.file_size,
len(zinfo.filename), len(zinfo.extra), len(zinfo.comment),
0, zinfo.internal_attr, zinfo.external_attr,
zinfo.header_offset)
self.fp.write(centdir)
self.fp.write(zinfo.filename)
self.fp.write(zinfo.extra)
self.fp.write(zinfo.comment)
pos2 = self.fp.tell()
# Write end-of-zip-archive record
endrec = struct.pack(structEndArchive, stringEndArchive,
0, 0, count, count, pos2 - pos1, pos1, 0)
self.fp.write(endrec)
self.fp.flush()
if not self._filePassed:
self.fp.close()
self.fp = None
class PyZipFile(ZipFile):
"""Class to create ZIP archives with Python library files and packages."""
def writepy(self, pathname, basename = ""):
"""Add all files from "pathname" to the ZIP archive.
If pathname is a package directory, search the directory and
all package subdirectories recursively for all *.py and enter
the modules into the archive. If pathname is a plain
directory, listdir *.py and enter all modules. Else, pathname
must be a Python *.py file and the module will be put into the
archive. Added modules are always module.pyo or module.pyc.
This method will compile the module.py into module.pyc if
necessary.
"""
dir, name = os.path.split(pathname)
if os.path.isdir(pathname):
initname = os.path.join(pathname, "__init__.py")
if os.path.isfile(initname):
# This is a package directory, add it
if basename:
basename = "%s/%s" % (basename, name)
else:
basename = name
if self.debug:
print "Adding package in", pathname, "as", basename
fname, arcname = self._get_codename(initname[0:-3], basename)
if self.debug:
print "Adding", arcname
self.write(fname, arcname)
dirlist = os.listdir(pathname)
dirlist.remove("__init__.py")
# Add all *.py files and package subdirectories
for filename in dirlist:
path = os.path.join(pathname, filename)
root, ext = os.path.splitext(filename)
if os.path.isdir(path):
if os.path.isfile(os.path.join(path, "__init__.py")):
# This is a package directory, add it
self.writepy(path, basename) # Recursive call
elif ext == ".py":
fname, arcname = self._get_codename(path[0:-3],
basename)
if self.debug:
print "Adding", arcname
self.write(fname, arcname)
else:
# This is NOT a package directory, add its files at top level
if self.debug:
print "Adding files from directory", pathname
for filename in os.listdir(pathname):
path = os.path.join(pathname, filename)
root, ext = os.path.splitext(filename)
if ext == ".py":
fname, arcname = self._get_codename(path[0:-3],
basename)
if self.debug:
print "Adding", arcname
self.write(fname, arcname)
else:
if pathname[-3:] != ".py":
raise RuntimeError, \
'Files added with writepy() must end with ".py"'
fname, arcname = self._get_codename(pathname[0:-3], basename)
if self.debug:
print "Adding file", arcname
self.write(fname, arcname)
def _get_codename(self, pathname, basename):
"""Return (filename, archivename) for the path.
Given a module name path, return the correct file path and
archive name, compiling if necessary. For example, given
/python/lib/string, return (/python/lib/string.pyc, string).
"""
file_py = pathname + ".py"
file_pyc = pathname + ".pyc"
file_pyo = pathname + ".pyo"
if os.path.isfile(file_pyo) and \
os.stat(file_pyo)[8] >= os.stat(file_py)[8]:
fname = file_pyo # Use .pyo file
elif not os.path.isfile(file_pyc) or \
os.stat(file_pyc)[8] < os.stat(file_py)[8]:
import py_compile
if self.debug:
print "Compiling", file_py
py_compile.compile(file_py, file_pyc)
fname = file_pyc
else:
fname = file_pyc
archivename = os.path.split(fname)[1]
if basename:
archivename = "%s/%s" % (basename, archivename)
return (fname, archivename)
Здравствуйте, Ведмедь, Вы писали:
V>>Кстати, вот ты знаешь даже я (я вообще не очень похожу на 80-летнюю тётку) V>>не очень представляю себе, что ты имеешь ввиду под mmc, но знаю, что настройки V>>администрирования винды раскиданы где попало.. и стройной системы я там что то не замечал..
В>- Ты суслика видишь В>- Нет В>- А он есть (с) ДМБ
В>То есть ты хочешь сказать то что я не видел, того не существует. Ты видел как админстряться IIS, MSSQL, BizTalk, COM+ ?
Не поверишь.. Я их даже администрировал..
И поверь, заколебался.. Уж больно "дубово" и "тормозно"..
В>Вот то в чем они администряться называется mmc. В>И если надо ты с легкость можешь свою начинку вставить в mmc. И у тебя будет универсальный GUI интерфейс. Не надо будет изобретать
Мы обсуждаем потребности "старой тётки", если вы не забыли..
А для неё ваш анекдот как раз верен..
Я могу его даже дополнить..
— Загружаем ворд с диска..
— А диск где ?
— В компьютере..
— но я не видел, как вы туда его вставили, дискетница то пустая
— Но он там есть..
........
(Их услышанного)
Но, кроме того, непонятно, зачем то что вы перечислили на desctop-е..
Здравствуйте, vvaizh, Вы писали:
В>>То есть ты хочешь сказать то что я не видел, того не существует. Ты видел как админстряться IIS, MSSQL, BizTalk, COM+ ? V>Не поверишь.. Я их даже администрировал.. V>И поверь, заколебался.. Уж больно "дубово" и "тормозно"..
Расскажи, какая связка (система/сервер)самая шустрая на
бд
до 100Gb
до 300Gb
до 1000Gb
до 3000Gb
Здравствуйте, mihailik, Вы писали:
R_M>>> А если _деньги_ будет получать кто-то другой, то M$ перекупит и будет продавать сам. M>>Так это ж нормально. Все так поступают. Капитализм, однако. R_M>> Суть в том, что не всем нравится такая политика M$. M>Суть в том, что она никому не должна нравится. Мне тоже не нравится, что в магазине с меня деньги берут.
Очень странный поход к жизни, может сразу поехать в Африку, кушать бананы прямо с ветки.
Если рассматривать M$ как магазин, то выясниться, что они, как минимум, принуждают покупать товары внагрузку.
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, vvaizh, Вы писали:
PE>>>Ага. И надо иметь либы для С, С++, Паскаля, Жавы, Питона, Перла, Руби и тд и тд — сколько языков, столько и либ ? Не многовато ли ? V>>формат *.so он для всех языков один.. V>>как и формат *.dll в винде.. PE>Я не про это.
А я про это..
V>>Так что в перечисленных тобой фзыках V>>нужно иметь только враппер, чтобы вызывать оттуда функции (из *.so), V>>что давно уже сделано для всех перечисленных тобой языков (да я думаю и раньше OLE тоже..).. PE>Естественно раньше. OLE-ActiveX-COM решают пролемы, возникающие в использовании ДЛЛ.
Дык в том то и дело, что в случае spellchecker-а никаких проблем до сих пор не возникло..
V>>Ну и чем это удобнее наименования библиотеки и функций в ней? PE>1. Билиотека и так именуется. Только находиться может где угодно. PE>2. Функция как таковая не существует. Есть объект и у него есть методы. ООП.
Ну в нашем случае вся библиотека — это один объект, и что? Это противоречит ООП?
PE>>>Если ты пишешь аппликацию, которая сможет работать с разными компонентами, то эти компоненты должны иметь одинаковый внешний программный интерфейс. PE>>>Для этого есть средства соответсвующие. V>>Как они компоненты идентифицировать будут? V>>Как ты свой компонент идентифицировал? PE>IUnknown везде и всюду одинаков !
И у него есть метод "проверить орфографию"?
Ты все равно по нему (ну или по IDispatch)
получишь интерфейс для работы с орфографией..
Вот этот самый интерфейс ты как идентифицировать будешь?
V>>Что ты мне всё "есть" да "есть"... V>>Ты мне напиши, как ты "уже" сделал.. V>>А я посмотрю, удобнее это и проще, чем использование функций из библиотек или нет..
^^^^^^^^^^^^^^^^^
Нет ответа?
PE>У нас используется COM. Тебе должно ыть известны достоинства и недостатки COM по сравнению с ДЛЛ.
Я их перечисил выше..
Ты всё не помнишь..
Найди то место, и ткни меня, в достоинство, которое нужно для spellchecker-а..
Потому что я считаю, что этиз достоинств в случае spellchecker-а нет!
PE>>>>>Для COM это все не надо. Даже имени длл. V>>>>А как же ты компонент проидентифицируешь? PE>>>"Word.Application" PE>>>"Excel.Application" V>>Стоп.. V>>Вот ты перечислил 2 системы.. V>>Из твоей речи выше я так понял что есть 1!!!!!! компонент, который используется всеми остальными.. V>>Но ты почему то используешь не его, а что то другое (ворд) V>>Этого компонента нет? V>>Или он в ворде и ексель свой? V>>Чего ты мне чепуху то городишь.. V>>Назови компонент, который используется в 10-ит системах, и который 1! PE>MSXML, WebBrowser, MSHTML
Речь шла о spellchecker!
Для него дай.. 1 компонент!
V>>Я рад, жалко только что не твои плагины не всегда работают.. PE>>>Не нужно никаких врапперов. V>>Ну и какой C++ класс у тебя создаётся? V>>Тоже апишный? PE>Я даже не знаю, класс ли это. АПИ возвращает указатель на интейфейс IUnknown.
В C++ нет понятия интерфейсов.. Как и в паскале..
Как и в perle и в куче других языков
V>>>>>>Для JS ? V>>>>Аналогично V>>>>CreateObject — это и есть wrapper OLE для JS.. PE>>>CreateObject — это враппер для АПИ функции CoCreateInstance и только. PE>>>JS сам умеет работать с COM. V>>JS — сам по себе большой враппер, а не язык, своих собственных средств у V>>него очень мало, он как и vbs язык специально заточенный MS под COM.. V>>(по крайней мере то, что в Win называется JS..) PE>В точку. Но это не враппер, а язык. Библиотека ему не нужна — она уже есть в самом Ворде, экселе и тд.
Ага, и shell не нужна..
shell же не поворачивается рука назвать "языком"
Или, и из него COM можно использовать?
PE>>>>>Я ком юзал из С и Asm. Врапперов нет. Дядя, не смеши. Ты COM — я уверен — не знаешь. Без обид. V>>>> V>>>>Я чувствую, что ты так думаешь.. V>>>>Жаль тебя разочаровывать, но пару/тройку ком компонентов я написал, а сколько V>>>>использовал, вообще считать страшно.. PE>>>Я понимаю тебя. Я по большому счету ничего не писал, кроме COM компонентов и тд. V>>А ну тогда всё понятно.. V>>Узкий специалист подобен флюсу — полнота его односторонняя V>> (с) Козьма Прутков V>>Тебе видимо просто не с чем сравнивать.. V>>Так что ты меня всё таки не понимаешь.. PE>Мне есть с чем сравнивать. ДЛЛ — это уровень С. COM — это уровень С++, JS, ObjPascal и тд (ООП).
Ну нет в C++ никаких интерфейсов, сколько можно говорить..
А про уровень — это всё общие рассуждения..
Про то, где сказывается преимущества OOP тоже можно много говорить, и
я буду оспаривать мнение, что то как реализован spellchecker в word,
снаружи него OOP никакого преимущества не даёт..
V>>Вот тогда прокомментируй высказывание, что минимальный объём проги использующий чистый С — OLE — 2000 V>>строк.. В отличие от ispell, который можно использовать вызовом нескольких строчек.. V>>И уж тем более, в asm.. PE>Ну ты даешь. Что делает прога в 2000 строк ? PE>Вот минимальная прога PE>А чуть ниже я еще прожку подкинул
PE>
А где здесь использование OLE?
Я его что то не вижу..
вы просто его проинициализировали, никак не использовали..
Ваша программа эквивалентна пустому main-у..
PE>>>OLE — это старое понятие. OLE были в основном в ДЛЛ. Сейчас это не так. Ты же не только спелчекеры используешь. V>>Ну COM, какая разница.. Ты мне всё таки объясни, преимущества использования спеллчеккера через COM. V>>Про то что попадает в описанные мною 4 пункта, не нужна, для таких компонентов преимущества я знаю. PE>Использование спеллчекера не нужно делать чз COM если ты его сам пишешь. PE>Но если мне нужно использовать готовый, чтобы время с экономить ?
Я не оспариваю твоё решение, а лишь указываю, что отсутствие spellcheker-а в linux
в виде некого "компонента" ничуть не усложняет никому жизнь..
PE>Где мне скачать спелчекер для всех 7 языков ?
На linux он и есть для всех 7 языков..
PE>
.....
PE>
Посмотрел я код, и что то не нашёл, где ты в нём spellchecker вызывашь..?
Зато вижу что ты используешь врапперы для работы с XML, которые определены у тебя в файле parser.h..
Здравствуйте, VladD2, Вы писали: V>>Только MS и его поклонники страдают от того, что всё должно делаться "галочками" V>>(и web-service тоже) VD>Ты кстати, пробовал web-сервисы на студии делать? Попробуй. Тут конкуренты действительно отдыхают, все красиво, прозрачно и удобно.
Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, vvaizh, Вы писали:
V>>Чё то мы всё херню обсуждаем какую то.. V>>Давайте киньте мне код, который вы __уже__ написали, и посмотрим PE>Я пишу то, что сам писал, окей ?
Да, конечно..
PE>OLE в чистом виде да еще на Си — это не часто увидишь.
Если я не ошибаюсь, выше вы писали, что работаете с OLE без всяких wrapper-ов..
Чистый OLE он на чистом C написан, всё остальное — wrapper-ы над ним..
PE>
..
PE>
Я имел в виду код, который делает проверку орфографии..
Или это писали не вы (честно говоря искать кто таким хвастался, в лом..)
Здравствуйте, mihailik, Вы писали:
M>>Да, в XP и 2003 сервер. Уже сколько — больше года выходит.
R_M>>У меня сейчас не стоит XP, я даже ставить его не хочу (пока) по некоторым причинам. Сервер 2003 я на рабочий комп тоже ставить не хочу — назвался сервером, так и работай на серверах. И уж тем более я не буду переходить XP ради нескольких консольных утилит, просто возникает вопрос: какого #$#@%%*#$@ раньше этими утилитами ОС не комплектовали, можно подумать, что консольный таск менеджер — новейшее достижение в области информационных технологий.
M>Возникает ответ: а какого #$#@%%*#$@ ты раньше про это в Микрософт не написал директиву? Ты ж у них главный архитектор, как только они не догадались с тобой посоветоваться
Вы немного ошиблись, я не главный архитектор в M$, я всего лишь скромный президент мира.
R_M>>>Сторонние тулзы есть, но вот от M$ нет. M>>И сторонние есть, и свои. Впрочем, мне больше всего нравится tlist.exe, кажется из какого-то ResKit, он ещё чёрт знает когда сделан. В отличие от всех остальных, он красиво отображает дерево процессов (кто-то кстати, считал, что дерево процесов бывает только в Unix). R_M>>tlist тоже что-то не обнаружился. M>Он не входит в Windows, как я уже говорил. Просто удобная вещь, советую поискать на просторах.
Да уменя и так такие утилиты есть (pslist), да и сам написать смогу при необходимости, другое дело что подобные вещи желательно класть в стандартную поставку ОС.
R_M>>А вот на счет дерева могу сказать, что правильно, по крайней мере отчасти. В Linux есть четкое дерево, начинающиеся с процесса init. Когда один процесс теряет родителя, его родителем становиться init, есть даже функция getppid(). M>Ну да, по крайней мере ориентироваться проще. Да и для системных целей.
R_M>> В Windows это не так. Идентификатор процесса-родителя традиционно не используется, процесс родитель может просто завершиться, тогда этот идентификатор теряет смысл. M>Ну и обходятся без дерева. Здесь свои заморочки, свой монастырь.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, kcp, Вы писали:
kcp>Речь первоначальна шла о том, что "винда уже три года лидер кластерных систем". Я и дал ссылочку, чтобы человек посмотрел на настоящие кластерные системы.
VD>Для русских танкисто был приведен самый известый бенчмарк.
Я в отличие от г-на Oleja не могу похвастаться опытом по созданию кластеров. Просто хотел разобраться, что дает Windows лидерство в этом сегменте(?), т.с. с точки зрения простого человека.
Вот мои суждения не в пользу Windows: кластерная задача — это расчет, вывод(здесь меня можете поправить) редко можно видеть на экране. Так вот, поскольку консольный режим в Windows отсутствует, Windows резервирует некоторое количество памяти под свои (GUI-компоненты) в памяти. Я не буду судить, много или мало они забирают ресурсов, но в случае отсутствия оных производительность не уменьшилась, а возросла бы.
Я хочу сделать кластер на Windows|Linux. Ok. Просто, без никаких мониторовМышейКлавиатурПоддержкойUSB и другой мути. Зачем мне это? Потому, что я создаю целевую машину(ы) для своих расчетных задач, которые потребуют по возможности 100% загрузки CPU. Что мы делаем после покупки компьютеров. Правильно покупаем ОС- далее происходит чудо, оказывается в Windows ядро мы не можем сконфигурировать/оптимизировать под наши запросы в отличие от Linux ядра.
Вот у меня есть задача, допустим поиск больших простых чисел. Как мне написать это на Windows и на Linux? Вот тут я нарочно умолчу суть проблемы. Подскажите механизмы, которые мне нужно использовать в Windows и Linux, и насколько они быстрые/ресурсоемкие.
Вобщем вопрос ко всей аудитории, а не только к Вам, Влад.
... << RSDN@Home 1.0 beta 7a... а еще я в нее ем >>
Здравствуйте, Сергей Глазунов, Вы писали:
СГ>Вот у меня есть задача, допустим поиск больших простых чисел. Как мне написать это на Windows и на Linux? Вот тут я нарочно умолчу суть проблемы. Подскажите механизмы, которые мне нужно использовать в Windows и Linux, и насколько они быстрые/ресурсоемкие.[/list]
Короче тебе нужен суперкомпьютер. Это только Unix.
Здравствуйте, vvaizh, Вы писали:
PE>>OLE в чистом виде да еще на Си — это не часто увидишь. V>Если я не ошибаюсь, выше вы писали, что работаете с OLE без всяких wrapper-ов.. V>Чистый OLE он на чистом C написан, всё остальное — wrapper-ы над ним..
PE>>
V>..
PE>>
V>Я имел в виду код, который делает проверку орфографии.. V>Или это писали не вы (честно говоря искать кто таким хвастался, в лом..)