dervish_candela: (Dervish)
import string
import os

thumbnail_size = "M"

data = open("links.txt", "r") #файл с диска, содержащий ссылки
of = open("result.txt","w")

template_img = r"""<img src="{thumb_address}" border="0" vspace="2" hspace="2">"""
template_a = r"""<a href="{target}">{image}</a>"""

for line in data:
    link = line.strip()
    path, filename = os.path.split(link)    

    thumbname = path + """/"""+ string.replace(filename,"orig",thumbnail_size)
    img = template_img.format(thumb_address=thumbname)
    a = template_a.format(target=link,image=img)
    of.write(a)

может, когда-нибуь соберусь прикрутить к нему гуй...
dervish_candela: (Default)
наткнулся на совершенно перкрасное:

It could help the users if the people promoting C++ realized that the consistency of a grammar is not something you "worship", but a technical property which is far easier to achieve than it is to deal with the consequences of not having it.

печальный, пронзительно трагический текст.

Сколько моего мозга я потратил на изучение С++. Я искренне восхищался его сложностью. Оказывается, это не просто делает его непригодным к решению практических задач (это я сам заметил года 2 назад), а он в принципе порочен как техническая система, во всех ипостасях. Забавно, что мне часто попадалась шуточная статейка под якобы авторством Страуструпа, в которой хается С++, но вот настоящий, системный разбор его принципиальных недостатков (не обсуждение синтаксиса, хотя синтаксически он тоже не сахар) я вижу впервые.

Впрочем, как нам уже давно поведал ESR, «учите C и Питон», и будет всем счастье.

Вот ещё несколько замечательных цитат:
— This is what you get when you shift a file object by an integer. (о бессмысленности извращённого потокового синаксиса iostream)
— You say the software works with objects - where are they?
— a serious abstraction violation, you could get arrested for that in some jurisdictions.
— C++ helps with the tradeoff of safety vs. usability by eliminating both.
— in theory other things could happen; in general, C++ is excellent in theory
— ...and you didn't want to control the order of construction, you wanted it to "just work", right? (о конструкторах)
— Those who use computers to do any useful work are probably immune to brain-crippled syntax, because there are more painful things, like brain-crippled semantics.
— The pair of words "almost compatible" is almost meaningless (о совместимости С и С++)
— The problem with Foo and Bar is that the C++ grammar is FUBAR. (о невозможности однозначно отличить объявление функции от декларации объекта и/или найти определение)
— Preventing people from "seeing" the code in the sense that they can access it, but not understand it is obfuscation, not encapsulation. (об извращении и непонимании целей ОО)
— You see, the C++ standard doesn't assume you have a screen, a network controller or hardware for regular expression matching. (о паскудном убожестве стандартной библиотеки)
— You have to carefully define "object-oriented" so that C++ fits the definition. (просто истина десу)
— Or we can use a real object-oriented language, where the problem doesn't exist in the first place. (удивительно, но это так!)
dervish_candela: (Default)
Так как фотобукет был, - и, похоже, остался, - одним из немногих адекватных хостингов, то я до исх пор с него никуда не перешёл. Немножко допилил workflow: для загрузки из проводника или ACDSee по правой кнопочке мышки используем их древний аплоадер (они прекратили распространять его, даже не отладив как следует, но оставили API на месте, и он до сих пор работает). На сайте получаем список ссылок и из них с помощью нехитрого скрипта на питоне генерим простенькую галерею именно так, как нам нужно. Если бы им пользовался ещё кто-то кроме меня, объективную эргономику можно было бы допилить до чего-то более приемлемого — сделать гуёвый экзешник, подцепить к буферу обмена, генерить гелерею из списка файлов независимо от их загрузки, итд; но мне и так неплохо.
примитивненький скрипт )
Для больших серий публичных фотографий планирую всё же перейти на яндекс или гугл. Пока что тестирую яндекс. Непривычно, но вроде всё нужное на месте и работает.
dervish_candela: (Default)
Пять минут позора, и иерархия готова зато даже понимаю, что в новой проге происходит.

Хотел вписать в конструктор базового класса, чтобы он возвращал одного из детей по обстоятельствам, но обломался: оказалось, так сделать нельзя :/

А вот что происходит в старой, я осознаю (до сих пор) с большим скрипом :( Ибо гораздо больше, чем фашистскую квалификацию нелокальных имён, я ненавижу глобальные переменные. Только что обнаружил, что в середине вроде бы уже раскопанного алгоритма, одною из многочисленных процедурок сайд-эффектом содержимое Большого Массива Данных подменяется на совсем другое; и размер у него становится на пару порядков меньше. А данные об этом факте передаются наверх, (surprise) конечно же, переписыванием другой глобальной переменной. Чтобы было легче разобраться, их сразу три - Count, DataCount и ActualCount (типа честно-честно, верьте нам). Боже, какая мерзость! А для кого-то передача функции словаря без упаковки кваргов - уже конец света...

Posted via mobilebloger
dervish_candela: (Default)
Хорошая штука, однозначно удобнее XRCed'а хотя бы тем, что имеет поясняющие комментарии ко всем этим флагам в сайзер-айтемах. Идея писать пользовательский код в наследуемом классе впервые до меня дошла и поразила своей очевидностью и правильностью =) Генерировать код формы и наследовать его в сто раз удобнее, чем загружать из XRC.

On another note, оказывается, есть такая чудесная функция vars, которая объединяет всю эту мишуру типа locals(), globals() и __dict__ в одну кучу, что всё запутывает ещё больше очень удобно: vars() is locals() и vars(o) is o.__dict__
dervish_candela: (Default)
>>> bool((None,None))
True

Но я не об этом. Оказывается, не существует штатного способа инкапсулировать работу с кучей параметров. И атрибуты объекта, и переменные класса доступны только в квалифицированном виде. Единственный способ обойти это уродство - засрать пространство имён модуля глобальными переменными Т_Т ?

Кстати, а как это сделать? как изнутри модуля получить доступ к его __dict__ ? Никак?

Потому что я не намерен писать формулы вида self.a + self.b / self.c. (даже с учетом замены «self» на «o»)
И уж точно я не собираюсь писать
с = self.__class__
с.a + с.b/с.с

Боже, ребята, что вы сделали с языком? Т_Т он же абсолютно непригоден к каким бы то ни было вычсилениям, если каждый неглобальный чих нужно квалифицировать.

P.S. Я наконец догадался заменить «self» на «o», от слова «object», ведь кругляшок идеально символизирует объект — можно представлять себе, что это такой специальный синтаксис :) Заодно и бойлерплейта стало в разы меньше, теперь это можно писать руками, не убиваясь об стену.

UPD: «So you're writing a library, and you have this object that keeps showing up in parameters or attributes everywhere, even though there's only ever one of that thing at a given moment in time.»

Звучит знакомо, правда? Это вступление к описанию библиотеки Contextual. К сожалению, я слабо подкован в теории и практике промышленной разработки и не смог с наскока понять, как оно поможет лично мне (и поможет ли). Но подобные вещи звучат вкусно:

«In addition to these simple pseudo-global objects, peak.context also supports other kinds of context-sensitivity, like the concept of "settings" in a "current configuration" and the concept of "resources" in a "current action" (that are notified whether the action completed successfully or exited with an error).»

UPD2: Ещё есть некая PyContext, но кроме одной слабовнятной статьи, информации по вообще ней ноль.
dervish_candela: (Default)
ну что, товарищи по несчастью, помогайте ещё?

основной вопрос: что говорит Истинное Функциональное Программирование® о Девственно Чистых Методах произведения Запутанных Расчётов™?

а) Традиционно оформить кучу настроек и функций-методов для их обработки мы можем в виде класса, настройки поместить в перменные класса, и сделать особые функции для их установки и валидации типа set_parameters_type1.

а.1) вариант: вообще не делать параметры переменными, а поместить их в свой словарь или свой мини-класс (что в общем-то одно и то же), таким образом их можно будет передавать конструктору.

б) Чтобы избежать больших веток «if...then...else» в каждом из методов, мы можем главные настройки (тип вычисления, вид вычисления) вынести наверх; и сделать иерархию парочки классов, инстанцируя нужный для конкретной обработки и заполняя поля с помощью упомянутых set_parameters. Вместо одной проблемы мы получаем другую. Этот подход неприятен вынесением половины важнейшей логики наружу объекта для обработки данных, поэтому...

б.1) поэтому мы наверное захотим механизм условного инстанцирования упрятать в какую-нибудь «фабрику», что результирует в куче лишнего кода для убийства глаз и сущностей для убийства своих мозгов!

б.2) аналогично варианту а.1 совокупности параметров представлять своим объектом, что позволит немножко более осмысленную «фабрику».

в) плюнуть на всё и воспользоваться модулем как инкапсулятором. настройки - свободные для функций в основном пространстве; массив данных - глобальный. этот метод достаточно прост для чтения год спустя, и по сути дела логически повторяет подход с классом (в один момент времени проводится одно вычсиление, больше одного экземпляра класса нам бы не понадобилось), но мы лишаемся гибкой реюзабельности класса.

вариант г) мы не рассматриваем, чтобы не навлечь ярость Amnesty International и феминисток цивилизованных государств.

а как бы поступил иисус?
dervish_candela: (Default)
Настоящие программеры юзают шрифты фиксированной ширины. Heck, настоящие программеры юзают emacs, и пишут на нем FreeType для поддержки настоящих шрифтов. Какое счастье, что я — не настоящий программер :)

В свете этого, подскажите мне, пожалуйста, настоящий шрифт. Чтобы слова были похожи на слова, а буквы - на буквы. Если такое есть, конечно. Для ориентировки, эстетически лучшее из стандартного набора санс серифов винды для программирования - требучет. Заоcтренные углы у букв А, и, м, v, w итд; отлично подобранные межсимвольные расстояния (забыл как зовётся на жаргоне), покатая буква Л (хотя бы, а если мне будет ползволено мечтать, то заострённая. откуда взялись эти ужасные кособокие П вместо Л?), и желательно другое начертание в курсиве (для комментариев, очень помогает). В принципе, требучет меня всем и устраивает, кроме отсутствия стрелочек ← и →. Есть ли что-нибудь похожее или лучше, но с ними?

P.S. Впервые я (банально, но) задумался переключить шрифт после Страуструпа.
Для С++ мне это предложение и казалось, и кажется слишком сомнительным - С++ (а вернее, С) очень опирается на использование пунктуации в синтаксисе, и использование пропорциональных шрифтов может превращать код в кашу. Может и не превращать, если вы используете шаблоны, stl, итераторы вместо указателей, foreach вместо for и так далее.
Как эвристику можно принять, что, чем выше уровень по шкале «код — текст», тем лучше воспринимается пропорциональный шрифт вместо моноширинного.
dervish_candela: (Default)
вопрос не такой дурацкий, как кажется. хотя и не столько технический, сколько философский стилистический.

код, который у меня идёт за основу, ужасен. есть цепочка вызовов вида:
bRes = Convert(); //bRes - это флаг успеха, а обработка данных - сайд-эффект; божичка, как же жить страшно.

если бы я переписывал это на С++, я бы просто сделал вот так:
Convert(&data); //тонкий намёк на кровавые сайд-эффекты виден издалека, ясен как день и кристально понятен

но что мне делать в питоне? если я напишу просто
Convert(data) #и чо?
я сам же через полчаса забуду, что этот (мутабельный) массив вообще где-то там обрабатывается. а так как он занимает минимум несколько мегабайт (до 16) в памяти, плодить его копии не очень хочется :/

насколько мудро будет написать вот так:
data = Convert(data) #технически, это работает (что происходит при ребинде имени к тому же объекту? ничего?), но выглядит так, как будто я что-то курил

или лучше будет наплодить новых имён и писать скажем так:
converted_data = Convert(data) #при том ,что указывать они будут на один и тот же массив, мне это не кажется очень разумным :/

или не паритсья и просто вернуться к изначальному варианту в менее кретиническом виде, сделав data обратно глобальным?
dervish_candela: (Default)
Качнул wxWidgets для С++ на случай, если придется отказатьься от вхпитона. Тогда бы я повыдирал с корнем MFC и взамен бы воткнул wx... Открылсла, почесалсла репслу. Открыл билд проект (build\msw\wx.dsw), запустил построить всё. Час спустя - 200 из 300 успешно, 100 фейл. Ну ладно. Открыл семплы, ни один проект не компилируется (тыкал наугад).
А я ведь просто хотел посмотреть демо...

Для сравнения, любое приложение на wxPython запускается после установки одного-единственного инсталлера пакета. Неужели нельзя было предоставить что-нибудь более дружественное :/
dervish_candela: (Default)
пеарю:
http://www.finalcog.com/node/20
в основном очевидное, но всё равно приятно и полезно.

P.S. Когда всё успеть >_<
И, самое непонятное, откуда на меня столько всего свалилось? То есть откуда, это понятно, но как я это допустил?! Надо срочно юккурить, пока не поздно.
dervish_candela: (Default)
погода FFFFFUUUUU~
почему код лучше всего пишется, когда настроение хреновое и чувствуешь себя как зомби?
это объясняет, впрочем, почему я не помню большую часть моего серьезного и рабочего кода. смотрю, — да, похоже, мог такое написать; но как писал — не помню.

когда всё успеть?

P.S. опера 10.51RC3
Боже, я в тебя уверую. Неужели мы снова узрим Её светлый лик?
Скин становится с каждой итерацией всё менее объемным, всё более плоско-гномо-линуксячьим. Надо же. Сколько лет прогресса должно было пройти, чтобы заново открыть плоское убожество. Но спасибо хоть «нативный», хоть и мало имеет общего с тем истинно аскетическим виндовым, что был до 9.20, всё же под XP(cтандартная) приятен куда более новомодных финтифлюшек.

P.P.S. Боже, как она быстра и прекрасна!
Драгонфлай великолепен, но поставить «inspect» последним пунктом меню вместо традиционных «свойств» было не очень умной идеей.
Назначаемые закладкам имена просто прекрасны. Новый контрол автодополнения могу только одобрить, хотя чуть-чуть его спрессовать бы визуально, очень уж много по современной моде пустого места.
dervish_candela: (Dervish)
эта штуковина заворачивает функцию (генератор) в класс и навешивает ей так необходимые каждому уважающему себя контекстоуправителю ушки __enter__() и __exit__().

осталось разобраться, когда выгружается длл-ка, то есть, как именно умирает ctypes.CDLL. из-за автоматического дворника, не так все просто с деструкторами...

Posted via mobilebloger
dervish_candela: (Default)
Мама мия. Чёрт меня дёрнул довести это до конца. Итак, вашему вниманию: танец с сопялми свиг без исходников (дано: 1×dumb.dll на MFC без исходников, 1×dumb.h, 1×dumb.lib).
Осторожно, моск. For exxxtreme geeks only.

сгенерировать обёртку, предварительно убрав __declspec(dllimport):
swig -python -c++ -module dumb_wrap dumb.h

получим:

dumb_wrap.cxx
dumb_wrap.c //нам не нужно
dumb_wrap.py

вернуть __declspec(dllimport) на место,
создать проект длл,
переключить в release (иначе будет требовать несуществующую python26_d.lib, вместо которой не получится подставить обычную),
скопировать python26.lib в папку проекта (прагма отказывается работать с абсолютными путями),

вместо #include <Python.h> в .cxx сгенерированном SWIGом файле добавить

#include <C:\Python26\include\Python.h>
#pragma comment(lib, "python26.lib") //подключение .lib-файла. в настройках проекта можно не указывать.

и там же
#define WINVER 0x0501
#define _AFXDLL //разрешить MFC
#include <afxwin.h> //подключить MFC

в принципе, оное надо только затем, чтобы не искать и не добавлять вручную все источники тупых макросов типа DWORD, CONST итд.

#include "dumb.h"
#pragma comment(lib, "dumb.lib")

получившуюся в итоге dll переименовать (это важно) в подчёркиваниеdumb_wrap.pyd

enjoy your aids.

Большая часть из этого выяснена в процессе, случайно. Интересно было бы посчитать шансы против меня.

дальше сибаритствуем:

import dumb_wrap
d1 = dumb_wrap.CDumb()
dervish_candela: (Default)
я устал от поддержки древнего уродца на MFC решил написать его заново на вхпитоне. проблемка только одна: обеспечивающая функциональность DLL написана через задницу, и экспортирует класс (что самое смешное, смысла в этом ноль, так как инициализируется объект класса не в конструкторе, а извне, в клиентском коде). скормить это ctypes я не могу.

Я пишу небольшую промежуточную DLL-ку, которая будет создавать этот объект и делегировать экспортируемые функции к соответствующим методам объекта. Внимание вопрос: я должен выделить достаточно большой (16Мб) буфер для инициализации того самого объекта. Где лучше это сделать: создать его в DLL-враппере и выдать ссылку на него клиенту на питоне, или наоборот: создать буфер в клиенте и передать его врапперу? Честно говоря, я даже не знаю, какими критериями руководствоваться...

UPD. пока что сделал выделение буфера внутри длл-лки.
UPD2. предварительно работает. оказалось проще, чем я думал. осталось подключить оборудование (что не так просто), написать для начала простейший опросчик и начать обвешивать логический костяк гардами, кейсами, ассертами, инвариантами и обработчиками исключений. FFFFFUUUUUU~
dervish_candela: (Default)
перешел со стандартного гуглопоиска поиска на ихнюю приблуду I'm feeling lucky.
Для тех, кто не в курсе - это просто перенаправление сразу на первый результат, то есть именно то, что в 99.9% нас интересует.

Для этого к стандартному запросу
http://www.google.com/search?&q=%s
добавляем в конец &btnI=I%27m+Feeling+Lucky.
Ставим поиском по-умолчанию, профит. Только почему-то не ставится. По ключевому слову («g», «ifl», добавить по вкусу) из адресной строки работает, а вот из SpeedDial'а как служба поиска по-умолчанию - нет. Вылезает просто гугл.
Алсо, интересно, как изменить ту службу, которая «искать в веб»?

AkelPad 4

Mar. 3rd, 2010 01:34 pm
dervish_candela: (Default)
оказывается, актуальная версия уже бампнулась, и обладает уже весьма взрослой подстветкой кода. Не полноценный синтаксический анализатор, правда (многострочные коментарии обламываются) — но глупо ожидать от лучшего блокнота того, с чем со скрипом справляются даже лучшие ide.

Осталось переписать туда комодскую схему, и я буду абсолютно счастлив. Правда, геморрой прозреваю тот ещё.

Из других полезных добавок - явный индикатор BOM.

Speaking of BOM, нашёл вот такой убер-рулез: универсальный детектор кодировок.
Как всегда - что ни придумай, это уже сделали =) Если верить автору, это адаптация мозилловского детектора, основывающаяся на статистике символов.

Я закопипастил предложенный код и протеститровал немного на маленьких файлах, работает в принципе всё just as planned:
utf-8-sig → utf-8 1.0 (duh)
utf-8 без бома для файла с только ascii-символами → utf-8 0.99 (как?!)
windows-1251 c только ascii-символами → ascii 1.0 (just as planned)
windows-1251 c рус./лат. 50/50 → ~0.98
KOI8-R c рус./лат. 50/50 → ~0.9
OEM c рус./лат. 50/50 → ~0.7, для уверенного распознавания должно быть сильно больше русского текста.
Shift-JIS c лат. текстом и 1% каны → Shift-JIS 1.0, но ascii с только ascii-символами.

такая вот петрушка.
dervish_candela: (Default)
перешёл на питон 2.6
dervish_candela: (Default)
кто-нибудь знает, что вообще представляет из себя дебаг?
я бы радостно переключил конфигурацию на «Debug» и не думал ни о чём, но, к сожалению, в Debug программа собирается в что-то совершенно нерабочее. То есть она даже иногда (зависит от компилятора) запускается, но не работает, а выдает какую-то ересь вместо того, что надо. А в режиме «Release» я не могу никак её дебагить, ибо «нет символов». Спасибо за окошко с ассемблером, всегда мечтал. Получается, по-старинке пихаем в код бесчисленные сиауты?

Подозреваю, за кривизну ответственны те самые многочисленные сто раз перегруженные говномакросы типа _T, lpszTmpl и _tcsnset, но выкинуть их из программы или заменить безопасными версиями трудновато по той простой причине, что для этого нужно понимать, что они делают, а я эти участки вообще читать не могу, мозг отказывает. Ориентируюсь только по комментариям =)

Подозреваю также, что мне надо не вопрошать в жж, а идти на какой-нибудь программистский форум и шерстить архивы за декаду назад =)

Кстати, был вроде какой-то способ заставить программу использовать конкретную вресию crt?

April 2017

S M T W T F S
       1
234 5678
9101112131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 22nd, 2017 12:38 am
Powered by Dreamwidth Studios