- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
class OutSplitter(object):
""" splitter """
def __init__(self, out_splitter):
self.__pipes=None
if isinstance(out_splitter, OutSplitter):
self.__pipes = Set(out_splitter.pipes)
elif out_splitter:
if hasattr(out_splitter,"__iter__") : #
for pn in out_splitter:
self.add_pipe(pn)
else:
self.add_pipe(out_splitter)
@property
def pipes(self):
return self.__pipes
def add_pipe(self, pn):
if isinstance(pn, basestring):
if pn == 'stderr': x = sys.stderr
elif pn == 'stdout': x = sys.stdout
else:
p = os.path.dirname(pn)
if p and not os.path.exists(p):
os.makedirs(p)
x = open(pn,'w+')
else: x = pn
if hasattr(x, 'write') and hasattr(x, 'flush'):
if self.__pipes is None:
self.__pipes=Set()
self.__pipes.add(x)
def write(self,s):
if self.__pipes:
for p in self.__pipes:
p.write(s)
def flush(self):
if self.__pipes:
for p in self.__pipes:
p.flush()
class CatalogsWalker(OutSplitter):
def __init__(self,catalogs,out_splitter=None):
OutSplitter.__init__(self,out_splitter)
self.__catalogs = catalogs
self.__file_counter, self.__catalog_counter, self.__start_time, self.__speed = 0, 0, 0, 0
def __iter__(self):
self.__file_counter, self.__catalog_counter, self.__start_time, self.__speed = 0, 0, 0, 0
self.__start_time=time.time()
for catalog in self.__catalogs:
for p,d,ns in os.walk(catalog):
_ = d;
self.__catalog_counter+=1
for n in ns:
self.__file_counter+=1
self.__speed=self.__file_counter/(time.time()-self.__start_time)
self.fanny_indicator(self.__catalog_counter, self.__file_counter, self.__speed)
yield p,n
@property
def catalog_counter(self):
return self.__catalog_counter
@property
def file_counter(self):
return self.__file_counter
@property
def start_time(self):
return self.__start_time
@property
def speed(self):
return self.__speed
def fanny_indicator(self,p,n,s):
if self.pipes:
_result="\rcataloges:" + repr(p).rjust(8) + "\tfiles:" + repr(n).rjust(13) + "\tspeed: %12.3f"%s + " files/s"
self.write(_result)
self.flush()
Что хорошего в этой помойке? Кстати, там парсер ббкодов нормально заработал?
Один такой долгое время читал маны по мускулю на mysql.ru в переводе отечественных быдловебкодеров
Я не преклоняюсь перед иностранным, но аналога, например, stackexchange/stackoverflow, где можно перевести вопрос на simple english и получить нормальный ответ, в рунете просто нет. И еще очень много чего нет.
Что-то мне намекает, что их нет и в дойчнете, и у французов нет, и у японцев с китайцами нет...
В смысле перевести, вбить в гугл и получить ссылку на SE. Как форум ресурс - говно.
2. в чем смысл этого кода? В тулзе которая обходит папки и считает время? Вы пайтон изучаете?
3. "fanny" -- вентиляторный? Или Каплан? Любить нужно русский язык, как Вы верно заметили, а вот английский программисту не плохо бы знать.
4. Интерфейс у fanny невнятный и magic numbers внутри
5. Вместо проверки на write и flush, лучше юзать ABCMeta. Это же как-бы API, считается что некто может разработать новый пайп (для писания в TCP сокет видимо, или в лог по syslog), так что утка тут не нужна.
6. Вообще есть io.IOBase, так что всё выглядит немного велосипедом
7. Зачем вокер наследник аутпутсплитера? Хождение по папкам -- частный случай писания в пайп? Тут классическая ошибка ООП проектирования: использование наследования для реюзания кода. По факту же нужда _ДЕЛЕГАЦИЯ_. Передавайте вокера (а еще точнее лист io.IOBaseов) в ваш вокер
8. и фанни свой тоже сделайте ABCMeta, и назовите его Reporter, и сделайте у него нормальный интерфейс (например метод add_progress), чтоб не завязываться именно на текстовый аутпут. А если завтра нужно будет через Tk в GUI результат выводить? Пусть вокер получает Reporter, а реализация репортера (TextReporter) получает стрим (в нашем случае stdout какой-знить или файл).
9. И следующий раз начинайте всё таки с бизнес-задачи, потому что не очень понятно зачем вообще всё это
И иногда там наверху перед тем как делать кучу работы(например сортировки перед в каком-нибудь too_funny_print) я проверяю например if out_splitter.pipes is None:
Какой смысл что-то там сортировать для вывода, если выводить некуда?
В Вашем врианте эта проверка дороже, делать ее все же стоит. Но все равно спасибо и я еще подумаю на эту тему.
Если профилирование программы (с помощью cProfile например) не доказало что это сортировка занимает 80% времени и является боттлнеком, то лучше все таки писать меньше букв и не думать о цене сортировки
Тем не менее я Вам, Анонимус, очень благодарен за очень конструктивную критику. И надеюсь что покритикуете еще когда я все перепишу "по уму"
О производительности следующий пост
Они сложнее, но сложности эти созданы на ровном месте.
Я уже всем сердцем ненавижу сишный клиент зукипера - течёт как сито и рейс-кондишены вылезают в самый неподходящий момент.
которые скс прокладывают?
В мире кроме ядер очень много всего, связанного с сетями.
что никак не мешает, если надо, запилить свой однонодовый веб-сервер на с++ с отличными показателями производительности ценой, скажем, 200 строк кода
то, что ты перечислил, не имеет сложной бизнес-логики
т.к. программы на сишке проще, чем на с++
попробуй на сишке написать опенофис
Опенофис не писал на си Но сложнейшую скада-систему с графикой и многопоточностью под еще под DOS!!! писал на asm 8086.
причем тут то, какой процент работы берёт на себя ядро?
речь о том, как решаются одинаковые бизнес-задачи на как бы разных языках, где с++ выступает в роли говна, а С в роли спасителя
> и многопоточностью под еще под DOS на asm 8086
напрашивается логичный вывод - программки на асм короче программок на С
охохо пошли реальные цифры из сишных проектов в 10к файлов на один процесс?
кстати, каюсь
ни разу не пришлось менять аллокатор
почему-то на стандартном всё устраивало
проблемы сетевиков?
Если в линупсячем ядре захочется поменять настройки аллокации в какой-то подсистеме, нужно будет также пройтись по всем вызовам и подправить флажки.
процедурное?
ООП - это нормально
в любом хорошем сишном проекте есть ООП
где сущности выделены в своих структурах со своими данными, где есть место абстракции и полиморфизму, даже виртуальным методам
просто вместо сахарка это всё приходится делать руками, всё руками
Yes, you must write more code in class implementation (once). But you'll have less code when using that class (many times).
В чем разница с написанием и использованием библиотек при процедурном программировании? Ну кроме субъективного мнения "так нагладнее и удобнее"
Который по нормалу генерирует IDE.
Расскажите пожалуйста, что Вы подразумеваете под "многопоточностью" тут, и как это было реализовано? Через прерывания?
Анонимус, я Вас понимаю, и Вы правы. В современных понятиях это многопоточностью трудно назвать. Но тогда почти 25 лет назад под DOS мало кто использовал слово thread. Я и мое окружение его даже не знало. Называли мы это многопоточностью. И в какой-то мере оно так и было. В современных понятиях это больше multithreading или может быть "просто параллельное исполнение" или его эмуляция. Использовали и прерывания (по таймеру в том числе) и "шитый код". https://en.wikipedia.org/wiki/Threaded_code.
Можно сделать кооперативную многозадачность на одном процессоре на одном процессе на одном потоке бесконечным евент-лупом (asyncio в пайтоне так работает). Можно сделать по таймеру с прерыванием, можно еще как-то)
И течку памятью (ну точнее распухание кучи до OutOfMemory) я тоже встречал)
Так что виноват тут не си)
Сегфолт прекрасно обрабатывается. Нужно только включить генерацию coredump-ов. Открываешь корку в дебаггере, смотришь состояния всех тредов.
>В джаве
Как?
В коммерческом софте именно так и делают. А еще и скрамблят гады, чтоб никто не расковырял.
--------
А еще может быть -XX:-OmitStackTraceInFastThrow
Кстати, софт на жаве же один хрен декомпилируется 1 в 1,если не обфусцировать?
Unknown Source. Добавьте к этому обфускацию и будет x(Unknown Source). Очень удобно.
------
не 1 в 1, но достаточно чтоб можно было прочитать и понять.
>не 1 в 1, но достаточно чтоб можно было прочитать и понять.
А зачем тогда это делать?
2) делать что? Обфусцировать код?
Чтоб враг не получил читаемый компилируемый исходник твоего продутка
Обфускаторы же маппинг имен сохраняют в файлик. По крайней мере жабий ProGuard так делал.
Но -g:none, один хрен, усложнит разбирательство
Отправить core dump разрабу (это можно даже на автомате замутить, в духе "отправить отчет об ошибке"). Жопа в том, что корка может весить несколько гигов и содержать какую-нибудь конфиденциальную инфу.
dr.watson же))
http://www.panoramafactory.com/drwtsn32.gif
Что это? Где его брать?
В линухах у многих дистрибов включен дампинг через ulimits
Винды, что ли? :)
>ничего делать не надо.
Отчет об ошибке отправляется с помощью службы Windows Error Reporting на специальный сервер Microsoft, где все отчеты сортируются и хранятся в централизованной базе данных. Для того, чтобы получить доступ к отчетам для конкретного приложения, разработчику нужно зарегистрироваться на сервере Microsoft, после чего он получает возможность анализировать отчеты об ошибках.
----
да и всякие seh есть: можно зарепортить же
Инфа 146%?
Пишут. Гораздо больше, чем вы можете себе представить.
Почему? Откуда инфа? Кто собирал статистику? У меня тут несколько миллионов строк кода на с++ под боком, многое так или иначе связано с сетью.
Так откуда инфа? Кто собирал статистику? Это по опенсорс проектам или по закрытым тоже?
а можно писать что-то другое, чем GUI-Network-Administrator, можно?
Потому что кому-то было влом делать публичное апи для нетлинка с фаерволом и роутером... Единственный документированный способ - дергать iptables/ip/ifconfig. У меня был депресняк, когда я это узнал... Пришлось клеить строки и exec'ом вызывать тулзы...
Риальным сетевикам не до этого.
но может быть нетфильтра, например?
В остальном Вы правы: говняшка -- тут:
http://www.netfilter.org/documentation/FAQ/netfilter-faq-4.html#ss4.5
man 7 netlink
Емнип, все эти iptables/ip/ifconfig общаются с ядром именно через netlink. Но протоколы там не документированные, а в доке явно сказано - exec'айте iptables, а к netlink'у не лезьте, он не для вас... Понятно, что они оставляют себе пространство для манёвра. Но всё-равно как-то неприятно.
Ну да, это я и имел в виду.
Ну ок, пусть эти ядерные протоколы будут деталью реализации... Но почему нельзя было вместе с тулзами приложить какой-нибудь libiptables - ума не приложу :(
4.5 Is there an C/C++ API for adding/removing rules?
The answer unfortunately is: No.
Now you might think 'but what about libiptc?'. As has been pointed out numerous times on the mailinglist(s), libiptc was _NEVER_ meant to be used as a public interface. We don't guarantee a stable interface, and it is planned to remove it in the next incarnation of linux packet filtering. libiptc is way too low-layer to be used reasonably anyway.
We are well aware that there is a fundamental lack for such an API, and we are working on improving that situation. Until then, it is recommended to either use system() or open a pipe into stdin of iptables-restore. The latter will give you a way better performance.
Да читал я ее тогда... Вот как раз о ней:
>> Единственный документированный способ - дергать iptables/ip/ifconfig. У меня был депресняк, когда я это узнал...
Одно время линуксоиды смеялись над виндой где часто было только 2 способа сделать что-то: через гуи/mmc (тоесть никак не автоматизировано) или через Win32API, тоесть совсем низкоуровнево.
Были правда COM и WMI, но почему-то не все про это знали.
Потом MS понял что всё плохо, и теперь cmdlet (API для пауершелла) -- мастхев для любого MS продукта.
Ну а линуксоиды говорили что у нас-то консоль ферст класс ситизен, так что у нас всегда будет возможность что-то автоматизировать посредством шелл скриптов. Ну вот иногда посредством ТОЛЬКО шелл скриптов.
Разумеется есть хорошие лиунксоиды а есть идиоты которые орут "винда мастдай" на всех форумах. Сам линукс тут не виноват)
http://freelansim.ru/tasks/93023
> Написать новый шаблон для робочого интернет-магазина
Ну там же написано "Киев":) Товарищ україномовний видимо.
Кстати, там "Joomla" же, причем тут Microsoft?
Свой закас пропиарил.
Честно говоря, луниксоидам надо по-свойски разобраться с кулхацкерами, которые говорят "только линупс, венды - говно!" Тогда они отмоются от дурной славы пердоликов-сектантов, никто ни с кем не будет воевать, систему бросится дорабатывать толпа народа, допилит недопиленное, заставит M$ задуматься, из-за чего Windows 11 будет просто волшебной. В итоге все будут в плюсе, кроме маководов, у которых уже сейчас всё работает и стремиться в общем-то не к чему.
Меня просто очень сильно поразили продуманные и нерушимые аргументы apgurman'а. Отвечать "Windows - рулит, Linux - отстой" не хотелось - всё же обе ОС нужны и бывают полезны. И я выбрал самый адекватный ответ из возможных.
И только потом я увидел http://joyreactor.cc/post/1679199
>> Меня просто очень сильно поразили продуманные и нерушимые аргументы apgurman'а.
Вовсе и непродуманный и не нерушимый и уж точно не аргумент. Наоборот, я хотел подчеркнуть глупость споров на эту тему и просил их прекратить здесь. Тем более пост вообще не об этом
Новый iDildo же вышел, в 2 раза больше предыдущего.
Прошу прощения, я-то наивно полагал, что они уже достигли идеала. А выходит, всегда есть куда расти. Буду знать.
Браузер у них как был говном, так и остался.
Так что бывает и такое, да) В целом же это чушь всё.
Не нужно ходить на ЛОР и дискутировать там с девятиклассниками в терминах "виндус сукс"
што?
Программками, которые хуй проссыш как под виндой запустить.
Программками, которые хуй проссыш как под досом запустить.
Программками, которые хуй проссыш как под линуксом запустить.
Программками, которые хуй проссыш как под опенбзд запустить.
Программками, которые хуй проссыш как под нетбзд запустить.
Программками, которые хуй проссыш как под фрибзд запустить.
Программками, которые хуй проссыш как под МакосьКлассик запустить.
Программками, которые хуй проссыш как под МакосьИкс запустить.
Программками, которые хуй проссыш как под ОС/2 запустить.
Программками, которые хуй проссыш как под OS/360 запустить.
Программками, которые хуй проссыш как под TR-DOS запустить.
Программками, которые хуй проссыш как под QNX запустить.
Программками, которые хуй проссыш как под VMS запустить.
Программками, которые хуй проссыш как под Solaris запустить.
Питон — это же какая-то старая досовская программа, если я не ошибаюсь, так?
Кстати, Вы даже не представляете под какие машины питон портировали:
http://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Foton.jpg/220px-Foton.jpg
Зачем Вы разговариваете с Копипаста:Руслан_Карманов ?
Руслан Карманов — унылый быдлотролль, обливающий говном красноглазых в своем уютненьком бложике. Какое-то время был весьма популярным персонажем в /s/. В последнее время активно подражает Гоблину. Эталонное копирастическое быдло из международной палаты мер и весов.
Отличается зашкаливающей ненавистью к открытому ПО и линуксу.
Руслан Карманов — это не только фабрика лулзов, но и отец сомнительного мема — Бога Питуха, который был немедленно подхвачен /s/ тиреча.
Хомячок Карманова?
>Батхерт незаметен.
Угу. Вижу как он незаметен, когда немножко питушиного гуру присрамили.
Кто его присрамил-то? Написали "Карман хуй" и залочили статью? Охуенно присрамили, да. Ну а сейчас он ударился в политику и скатился в УГ, а старый блог просрал.
Процедурный и ООП подходы имеют как минусы, так и плюсы.
Кроме того качественный процедурный подход имеет *некоторые* плюсы объектного: например Вы получаете handle какого-то объекта в памяти ядра (ну окей, какой-то структуры) и потом с этим хендлом везде ходите.
Виндовый API не стесняясь говорит про объекты в этом случае (там даже object manager есть) хотя это и чистый си.
Чем ниже уровень, тем больше скорость и место превалируют над выразительностью языка (и именно потому на высокоуровневом пайтоне красота важнее скорости), так что логично встретить в ядре си (тем более что API ядра в любом случае сишным должен быть).
Кроме того ООП помогает быстрее строить и поддерживать и изменять системы с огромным количеством не очень технических понятий: например интерпрайз. Сама мысль о том что код находится рядом с данными крайне полезна для инкапсуляции мелких вычислений типа user.findBoss().calculateSalary() итд. Код ядра ОЧЕНЬ далек от ентерпрайза, так что сравнивать его бессмыслено.
Другой такой пример это GUI фреймоврки, которые на ООП намного проще описываются (ибо паттерны bridge, wrapper итд)
Я не видел исходники QNX, так что про реал тайм мне говорить сложно. Обычный десктопный линух все же не реалтайм обычно.
"real-time" в кавычках в смысле не реал-тайм, а в смысле "там где скорость действительно имеет значение".
QNX не написан объектно.
Современные коды на С действительно более выразительны и часто близки к некоторым правилам ООП и кстати очень читабельны.
Я знаю один случай, когда то, что можно было решить для С кода, никак не решалось для C++, ну если конечно его не переписать с нуля. Это я к тому, что чем выше уровень языка, тем проще(в смысле быстрее) на нем писать, проще потом читать написанное, но тажелее выразиться более точно и правильно.
компилятор с++ не смог скомпилировать сишный код, потому что кто-то очень умный решил использовать с11?
Мой первый набросок этой утилиты был в истинно python(овском) стиле Написал за час, но потом почти час ждал пока он(набросок) прошерстит 40GB фоток на внешней флешке. Для сравнения представленная для критики версия справлялась уже за единицы минут.
Именно этого и хотелось.
1 Он мне нужен для других проектов и поэтому уже под рукой.
2 Смысл именно этого куска кода. иметь готовый класс, для обхода списка папок, без общего roota или просто папки, которая еще умеет выдавать данные, в первую очередь о том что она что-то там делает и как она быстро это делает в совокупности с остальным кодом. А осталпеpoisk-nedostayuschih-fajlov-/.
3 Спасибо за замечание. Это просто опечатка. Не буду сравнивать мой и Ваш английский. Не благодарное это дело, тем более это же Вы нашли эту ошибку. Мы здесь больше про Python говорим.
4 def funny_indicator(self, catalogs_cntr, files_cntr, speed_or_files_per_sec): Так было бы лучше?
5 Я поизучаю этот вопрос.
6 Это обертка к велосипеду. То что было "in top of my head" на момент когда я это быстро писал. Спасибо, это тоже тема для раздумий.
7 Может Вы и правы, но это же особенный worker? Он же еще и funny_indicator? Думаю что здесь Вы больше правы, чем я.
8 И здесь Вы правы. В оправдание могу только сказать, что изнвчально я хотел написать эту утилитку за 30 мин и уж точно не думал про GUI. Изначально это просто удобная утилита. Благодаря Вам в следующей версии подумаю.
9 В моем первом комменте и в этом я указал ссылку на описание откуда это и зачем нужно. На этом ресурсе все это не влезает, а на том, куда ссылка, никого нет и никто ничего не обсуждает.
Всё гораааздо страшнее, анон... https://translate.google.com/#en/ru/fanny
Так вот от какого слова произошло название awk!
На funnycode останутся олдфаги и интересные холивары, а на fannycode перенесут творения новостников и переводчиков Конардо и посты про модные гаджеты про даты в PHP и прочих языках.
Выпилены (на волан-де-сайт-2) космос, физика, научнопопулярная питушня, законы и железо.
Обсуждение музыки и аниме фильмов?
Кстати, а DIY куда попал?
Работа с ...
> DIY
Хм, недовыветрили его, оказывается. Стал непрофильным на вдс-1 (под названием "DIY или Сделай Сам"), имеет профильный аналог на вдс-2 ("DIY или Сделай сам" - букву "с" зачем-то уменьшили).
Эт что?
Господа-товариСЧи давайте конструктивнее. Вот Анонимус - молодец, заставил меня полностью переписать утилитку. Сейчас доперепишу и выложу, опять вам на радость, а мне на пользу.
ГК != stackoverflow. Сюда приходят поразвлечься, в основном... Ну иногда бывает и конструктив, когда совсем уж скучно.
Nobody says that we know english very well... For example I can estimate my knowledge like this:
- fluent reading for technical books/atricles, much worse for other books (I know very few ajectives);
- bad writing, but other people can understand me anyway;
- basic listening (with moderate speed and good pronunciation);
- shitty speaking (all "programmer's" words sounds like fucking mess).
You are fanny!
Хоть ничего плохого в этом нет, но просто не приятно от того, что в одном месте и конкатенация и форматирование. Почему нельзя было сделать:
Херовые названия переменных. Если для локальных переменных, или переменных где одна буква о чем-то говорит (i, j, k - итерация, k, v - ключ-значение, n - число (итераций)), то что такое funny_indicator(self,p,n,s) не понятно.
Больше пробелов! После знака препинания должен быть пробел. Традиция не ставить пробелы после запятых происходит от текстов мат. формул которые набирались для полиграфии, и в них печатники расставляли пробелы самостоятельно. Т.е. пробелы там все равно были, просто их ставил другой человек. Если вы сами же и автор и наборщик, как в примере с написанием програм, это просто неграмотно писать все слитно.
В суть написаного не вникал, но на вид это мог бы быть т.н. union-find структура. Set подразумевает много копирования. Но я не понял зачем вообще нужно копировать из одного такого же объекта в другой.
1 Не совсем понял "Set подразумевает много копирования." - какое копирование где и когда оно бывает в Set?
2 "зачем вообще нужно копировать из одного такого же объекта в другой." а где у меня там есть копирование?
Спасибо, что помогаете)
Ну и такие проверки как hasattr для чего-то относительно простого, не требующего изворотов с метапрограммированием и т.д. - буэ.
Красивше будет (ну и, если честно, то __iter__ проверять недостаточно, например, итерация может быть реализована через __getitem__.
> где копирование?
Это создаст "неглубокую" копию из одного такого же объекта в другом.
Но форматированный вывод в теории должен быть чуть быстрее, если в интерпретаторе нет специальной оптимизации для сумм иммутабельных строк.