<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5184667931452444492</id><updated>2012-01-06T02:44:55.568-08:00</updated><category term='logging'/><category term='Threading'/><category term='Reading'/><category term='Python'/><category term='ЯП'/><category term='KDE'/><category term='CDMA'/><category term='Architecture'/><category term='Google Reader'/><category term='Google Mail'/><category term='IoC'/><category term='Чтение новостей'/><category term='QA'/><category term='UI'/><category term='Windows'/><category term='SQLite'/><category term='open source'/><category term='Fun'/><category term='Movie'/><category term='Exception Handling'/><category term='Web'/><category term='ASP.NET'/><category term='ADO.NET'/><category term='Life'/><category term='Holywars'/><category term='TDD'/><category term='Firefox'/><category term='SQLAlchemy'/><category term='Образование'/><category term='Database'/><category term='Linux'/><category term='ORM'/><category term='celery'/><category term='IRC'/><category term='HTML'/><category term='Coding guidelines'/><category term='NHibernate'/><category term='soft'/><category term='Miranda'/><category term='VS2003'/><category term='T-SQL'/><category term='IronPython'/><category term='News'/><category term='Lifehack'/><category term='.NET'/><category term='Тесты'/><title type='text'>Заметки by Alexey Diyan</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>71</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8717827325775427807</id><published>2011-12-13T08:57:00.000-08:00</published><updated>2011-12-13T08:58:24.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='logging'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='celery'/><title type='text'>Celery loader hijacks/replaces standard logging configuration</title><content type='html'>Оказывается celeryd загрузчик перекрывает стандартную logging конфигурацию для того чтобы облегчить жизнь разработчику.&lt;br /&gt;&lt;br /&gt;Иинциатива конечно хорошая, однако для нас это было полной неожиданностью.&lt;br /&gt;&lt;br /&gt;К счастью есть как минимум два способа изменить это поведение. &lt;br /&gt;&lt;br /&gt;Быстрое, но не совсем полное решение это установить CELERYD_HIJACK_ROOT_LOGGER = False.&lt;br /&gt;&lt;br /&gt;Чуть более сложное, но концептуально верное решение это использовать setup-logging хук/сигнал, который предоставляет Celery.&lt;br /&gt;&lt;br /&gt;Ссылки:&lt;br /&gt;&lt;br /&gt;In 2.1 logging behavior was changed to not configure logging if it wasalready configured.  The problem is that some libraries does not playnice and hijack the root logger, or use &lt;cite&gt;logging.basicConfig&lt;/cite&gt; – resultingin users not getting any output or logs.&lt;br /&gt;&lt;a href="http://readthedocs.org/docs/celery/en/release21-maint/changelog.html#version-2-1-4"&gt;http://readthedocs.org/docs/celery/en/release21-maint/changelog.html#version-2-1-4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By default any previously configured logging options will be reset, because the Celery programs “hijacks” the root logger.&lt;br /&gt;If you want to customize your own logging then you can disable this behavior.&lt;br /&gt;&lt;a href="http://ask.github.com/celery/configuration.html#celeryd-hijack-root-logger"&gt;http://ask.github.com/celery/configuration.html#celeryd-hijack-root-logger&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;setup_logging signal.&lt;br /&gt;Celery won’t configure the loggers if this signal is connected, so you can use this to completely override the logging configuration with your own.&lt;br /&gt;&lt;a href="http://ask.github.com/celery/userguide/signals.html#setup-logging"&gt;http://ask.github.com/celery/userguide/signals.html#setup-logging&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8717827325775427807?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8717827325775427807/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8717827325775427807' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8717827325775427807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8717827325775427807'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/12/celery-loader-hijacksreplaces-standard.html' title='Celery loader hijacks/replaces standard logging configuration'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-88491948562139195</id><published>2011-10-16T15:43:00.000-07:00</published><updated>2011-10-17T14:07:11.078-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLAlchemy'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>SQLAlchemy for Python. Some queries examples including generated SQL</title><content type='html'>&lt;b&gt;UPDATE on 2011-10-18. Ответил на некоторые комментарии прямо внизу поста.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Не так давно мне посчастливилось организовать technology validation самого продвинутого ORM-фреймверка для языка Python, который называется SQLAlchemy.&lt;br /&gt;&lt;br /&gt;Признаюсь что перед стартом этого процесса я был достаточно скептически настроен, у меня была уверенность что я не увижу функционала, который бы хотя бы немного дотягивал до Java/Hibernate или .NET/NHibernate.&lt;br /&gt;&lt;br /&gt;На моем последнем .NET-проекте, который назывался TravelConfirm, я предложил использовать NHibernate, о чем ни разу не жалею. &lt;br /&gt;&lt;br /&gt;Более того, рекомендую всем сомневающимся внедрять его везде, где бы вы планировали использовать Entity Framework. NHibernate в связке с Fluent NHibernate прекрасно показали себя в работе с MySQL и Amazon RDS несмотря на то, что мы использовали в том числе и хранимые процедуры.&lt;br /&gt;&lt;br /&gt;Но давайте вернемся к SQLAlchemy.&lt;br /&gt;&lt;br /&gt;Статья на Wikipedia гласит что SQLAlchemy это open source SQL toolkit и object relational mapper, первый релиз которого был в феврале 2006-го года и что проект лицензируется под достаточно лояльной open source лицензией MIT.&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/SQLAlchemy"&gt;http://en.wikipedia.org/wiki/SQLAlchemy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SQLAlchemy поддерживает довольно внушительный список СУБД, который в первом приближении сопоставим с таковым у Java/Hibernate:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Drizzle&lt;/li&gt;&lt;li&gt;Firebird&lt;/li&gt;&lt;li&gt;IBM DB2 / Informix&lt;/li&gt;&lt;li&gt;MaxDB&lt;/li&gt;&lt;li&gt;Microsoft Access&lt;/li&gt;&lt;li&gt;Microsoft SQL Server&lt;/li&gt;&lt;li&gt;MySQL&lt;/li&gt;&lt;li&gt;Oracle&lt;/li&gt;&lt;li&gt;PostgreSQL&lt;/li&gt;&lt;li&gt;SQLite&lt;/li&gt;&lt;li&gt;Sybase&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Актуальную информацию по поддерживаемым диалектам можно увидеть тут:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/dialects/index.html"&gt;http://www.sqlalchemy.org/docs/dialects/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Еще одна особенность, которую я постояно наблюдаю в стеке Python, так это огромное изобилие библиотек, функциональность которых перекрывает, а иногда даже дублирует друг друга.  Это вносит некоторую дополнительную головную боль разработчику, но это "правильная вещь".  В рамках SQLAlchemy это выражается в том, что диалект каждой из представленных СУБД умеет работать поверх нескольких реализаций DB-API драйверов.&lt;br /&gt;&lt;br /&gt;Например с MySQL я могу работать используя MySQL Connector/J, MySQL Connector/Python, mysql-python,  OurSQL либо pymysql.&lt;br /&gt;Подробную информацию о поддерживаемых диалектах и DB-API драйверах можно увидеть по следующей ссылке:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/core/engines.html#supported-databases"&gt;http://www.sqlalchemy.org/docs/core/engines.html#supported-databases&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Думаю что вводной информации более чем достаточно, перейдем к делу. Ниже я буду приводить набор Python-тестов, которые используют ту или иную функциональность SQLAlchemy, сразу после кода теста будет приводится SQL запрос к SQLite базе, который генерирует SQLAlchemy.&lt;br /&gt;&lt;br /&gt;Хочу сделать акцент на том, что SQLAlchemy меня просто поразил чистотой генерируемого SQL-кода, который часто превосходит даже такого титана как NHibernate. Код приводится как есть, я только лишь расставил переносы строк и отступы для лучшей читаемости - в оригинале все эти запросы формируются в несколько длинных строк. Точно так же как это делает NHibernate.&lt;br /&gt;&lt;br /&gt;Нативный SQL-запроса с параметрами:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_from_native_sql_with_parameters(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User)\&lt;br /&gt;   .from_statement('SELECT * FROM user where name=:name')\&lt;br /&gt;   .params(name='User 4')\&lt;br /&gt;   .all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT * FROM user where name=?&lt;/pre&gt;&lt;br /&gt;Извлечение пользователей с сортировкой по трем параметрам в разных направлениях:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_order_by_several_columns(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User)\&lt;br /&gt;   .order_by(User.password)\&lt;br /&gt;   .order_by(User.name.desc())\&lt;br /&gt;   .order_by(User.age)\&lt;br /&gt;   .all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  user.user_id AS user_user_id, &lt;br /&gt;  user.name AS user_name, &lt;br /&gt;  user.age AS user_age, &lt;br /&gt;  user.password AS user_password &lt;br /&gt; FROM user &lt;br /&gt; ORDER BY &lt;br /&gt;  user.password, &lt;br /&gt;  user.name DESC, &lt;br /&gt;  user.age&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Извлечение пользователя, который первым попался под руку:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_first(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User).first()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  user.user_id AS user_user_id, &lt;br /&gt;  user.name AS user_name, &lt;br /&gt;  user.age AS user_age, &lt;br /&gt;  user.password AS user_password &lt;br /&gt; FROM user&lt;br /&gt;  LIMIT ? OFFSET ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Извлечение всех уникальных имен пользователей:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_distinct(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User.name).distinct().all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT DISTINCT user.name AS user_name&lt;br /&gt;FROM user&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Использование традиционных агрегирующих функций:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_max_min_avg_count(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   max_user_age = session.query(func.max(User.age)).scalar()&lt;br /&gt;   min_user_age = session.query(func.min(User.age)).scalar()&lt;br /&gt;   avg_user_age = session.query(func.avg(User.age)).scalar()&lt;br /&gt;   count_user_age = session.query(func.count(User.age)).scalar()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT max(user.age) AS max_1 &lt;br /&gt; FROM user&lt;br /&gt; &lt;br /&gt; SELECT min(user.age) AS min_1 &lt;br /&gt; FROM user&lt;br /&gt; &lt;br /&gt; SELECT avg(user.age) AS avg_1 &lt;br /&gt; FROM user&lt;br /&gt; &lt;br /&gt; SELECT count(user.age) AS count_1 &lt;br /&gt; FROM user&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Извлечение с группировкой:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_group_by(self):&lt;br /&gt;        with DbSession() as session:&lt;br /&gt;            result = session.query(User.name, func.count(User.user_id))\&lt;br /&gt;    .group_by(User.name)\&lt;br /&gt;    .all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  user.name AS user_name, &lt;br /&gt;  count(user.user_id) AS count_1 &lt;br /&gt; FROM user &lt;br /&gt; GROUP BY user.name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Надуманный вариант с подзапросом вместо традиционного join'а:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_subquery(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   subquery = session.query(User.name).filter(User.age &amp;gt; 21).subquery()&lt;br /&gt;   result = session.query(Developer).join(subquery, subquery.c.name == Developer.name).all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  developer.developer_id AS developer_developer_id, &lt;br /&gt;  developer.name AS developer_name &lt;br /&gt; FROM developer JOIN (SELECT user.name AS name &lt;br /&gt; FROM user &lt;br /&gt; WHERE user.age &amp;gt; ?) AS anon_1 ON anon_1.name = developer.name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Выборка данных с тремя inner join'ами:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_which_join_three_tables(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User, Developer, Parent)\&lt;br /&gt;   .join(Developer, Developer.name == User.name)\&lt;br /&gt;   .join(Parent, Developer.name == Parent.name)\&lt;br /&gt;   .all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  user.user_id AS user_user_id, &lt;br /&gt;  user.name AS user_name, &lt;br /&gt;  user.age AS user_age, &lt;br /&gt;  user.password AS user_password, &lt;br /&gt;  developer.developer_id AS developer_developer_id, &lt;br /&gt;  developer.name AS developer_name, &lt;br /&gt;  parent.parent_id AS parent_parent_id, &lt;br /&gt;  parent.name AS parent_name &lt;br /&gt; FROM user &lt;br /&gt;  JOIN developer ON developer.name = user.name &lt;br /&gt;  JOIN parent ON developer.name = parent.name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Выборка данных с одним jeft outer join'ом:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_left_outer_join(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(Developer, Parent)\&lt;br /&gt;   .outerjoin(Parent, Parent.name == Developer.name)\&lt;br /&gt;   .all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  developer.developer_id AS developer_developer_id, &lt;br /&gt;  developer.name AS developer_name, &lt;br /&gt;  parent.parent_id AS parent_parent_id, &lt;br /&gt;  parent.name AS parent_name &lt;br /&gt; FROM developer &lt;br /&gt;  LEFT OUTER JOIN parent ON parent.name = developer.name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ограничение выборки используя методы limit и offset из querying DSL:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_limit_offset(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User).order_by(User.name).limit(1).offset(1).all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  user.user_id AS user_user_id, &lt;br /&gt;  user.name AS user_name, &lt;br /&gt;  user.age AS user_age, &lt;br /&gt;  user.password AS user_password &lt;br /&gt; FROM user ORDER BY user.name&lt;br /&gt;  LIMIT ? OFFSET ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ограничение выборки используя метод slice с двумя параметрами из querying DSL. Вероятно в каком-то из диалектов метод slice может быть более эффективен:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_slice(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   result = session.query(User).order_by(User.name).slice(start=1, stop=2).all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT &lt;br /&gt;  user.user_id AS user_user_id, &lt;br /&gt;  user.name AS user_name, &lt;br /&gt;  user.age AS user_age, &lt;br /&gt;  user.password AS user_password &lt;br /&gt; FROM user &lt;br /&gt; ORDER BY user.name&lt;br /&gt;  LIMIT ? OFFSET ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Объединение нескольких запросов через использование union:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_union_selects_distinct_records(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   query1 = session.query(User.name)&lt;br /&gt;   query2 = session.query(Developer.name)&lt;br /&gt;   query3 = session.query(Parent.name)&lt;br /&gt;   result = query1.union(query2, query3).all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT anon_1.user_name AS anon_1_user_name &lt;br /&gt; FROM (SELECT user.name AS user_name &lt;br /&gt; FROM user UNION SELECT developer.name AS developer_name &lt;br /&gt; FROM developer UNION SELECT parent.name AS parent_name &lt;br /&gt; FROM parent) AS anon_1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Объединение нескольких запросов через использование union all:&lt;br /&gt;&lt;pre class="brush: python"&gt;def test_query_with_union_all(self):&lt;br /&gt;  with DbSession() as session:&lt;br /&gt;   query1 = session.query(User.name,)&lt;br /&gt;   query2 = session.query(Developer.name)&lt;br /&gt;   query3 = session.query(Parent.name)&lt;br /&gt;   result = query1.union_all(query2, query3).all()&lt;br /&gt;&lt;/pre&gt;Generated SQL:&lt;br /&gt;&lt;pre class="brush: sql"&gt;SELECT anon_1.user_name AS anon_1_user_name &lt;br /&gt; FROM (SELECT user.name AS user_name &lt;br /&gt; FROM user UNION ALL SELECT developer.name AS developer_name &lt;br /&gt; FROM developer UNION ALL SELECT parent.name AS parent_name &lt;br /&gt; FROM parent) AS anon_1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот примерно так выглядят типичые запросы на SQLAlchemy. К счастью мои опасения были напрасны - SQLAlchemy прекрасно справляется с задачей, когда нужно произвести выборку данных из базы.&lt;br /&gt;&lt;br /&gt;Более того, DSL для построения запросов в SQLAlchemy даже умеет ряд вещей, которых я не видел ни в NHibernate ни в Linq, а именно:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;подзапросы&lt;/li&gt;&lt;li&gt;предложения UNION, UNION ALL, EXCEPT, EXCEPT ALL, INTERSECT, INTERSECT ALL, HAVING, CASE&lt;/li&gt;&lt;li&gt;indexing hint'ы&lt;/li&gt;&lt;li&gt;bulk insert для любой СУБД (у NHibernate есть ограниченные возможности, причем работают только в Microsoft SQL Server)&lt;/li&gt;&lt;li&gt;bulk update/delete. При этом database session/unit of work не трекает изменений, но не смотря на это такая функциональность бывает нужна приложению&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;SQLAlchemy поддерживает три основных варианта мэппинга иерархии классов аналогично NHibernate, правда они используют немного другие термины.&lt;br /&gt;У SQLAlchemy термины Single Table Inheritance, Joined Table Inheritance, Concrete Table Inheritance соответствуют терминам Table per class hierarchy, Table per subclass, Table per concrete class из NHibernate:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/orm/inheritance.html"&gt;http://www.sqlalchemy.org/docs/orm/inheritance.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Более детально ознакомится с функциональными возможностями и их использованием можно используя официальную документацию SQLAlchemy:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/"&gt;http://www.sqlalchemy.org/docs/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE on 2011-10-18. Ответил на некоторые комментарии прямо внизу поста.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt; Что с Foreign Keys? (mapping/использование/генерируемый SQL)&lt;br /&gt;&lt;br /&gt;GUID. Поддержка реализована в первую очередь для PostgreSQL, но она не сложная и может быть расширена для других СУБД:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/core/types.html#backend-agnostic-guid-type"&gt;http://www.sqlalchemy.org/docs/core/types.html#backend-agnostic-guid-type&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GUID.Comb не поддерживается, так что если алгоритм очень нужен, то придется его портировать с NHibernate. &lt;br /&gt;&lt;br /&gt;HiLo генератор так же не реализован. Есть пример кастомного генератора для database shards, где говорится что его можно использовать как прототип для HiLo генератора:&lt;br /&gt;&lt;a href="https://bitbucket.org/sqlalchemy/sqlalchemy/src/54ee83285eef/examples/sharding/attribute_shard.py"&gt;https://bitbucket.org/sqlalchemy/sqlalchemy/src/54ee83285eef/examples/sharding/attribute_shard.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Post Insert генераторы не выделены явно, однако поддерживаются по-умолчанию. Identity, Guid.Native и любой другой генератор, который вычисляется на стороне БД декларируется одинаково:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/core/schema.html#server-side-defaults"&gt;http://www.sqlalchemy.org/docs/core/schema.html#server-side-defaults&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Database Sequence генератор:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences"&gt;http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Composite Primary Key генератор как частный случай Assigned Key генератора:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/2374243/is-it-possible-to-get-sqlalchemy-to-create-a-composite-primary-key-with-an-integ"&gt;http://stackoverflow.com/questions/2374243/is-it-possible-to-get-sqlalchemy-to-create-a-composite-primary-key-with-an-integ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;К сожалению привести примеры SQL не могу, так как для этого нужно делать тесты.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt; 2nd layer cache (memcached)?&lt;br /&gt;&lt;br /&gt;SQLAlchemy умеет работать поверх Beaker Caching, который отправляет NHibernate  в тяжелый нокаут по количеству поддерживаемых cache-бекендов.&lt;br /&gt;С другой стороны, SQLAlchemy предоставляет более явный Caching API, что одновременно и хорошо и плохо - все зависит от личных предпочтений:&lt;br /&gt;&lt;a href="http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching"&gt;http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt; Подзапросы в NH не так красиво как в Py, но всё же&lt;br /&gt;&lt;br /&gt;Если быть более точным, то поздапросы в NHibernate работают только при использовании QueryOver&lt;t&gt; и недоступны в Linq.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt; NHibernate {bulk/batching} на вскидку 2 варианта и с недавнего (3.2) времени дэфолтный:&lt;br /&gt;&lt;br /&gt;Bulk insert и query batching это немного разные вещи. Насколько эффективно реализован query batching в SQLAlchemy сказать не могу. Но вот bulk insert в SQLAlchemy реализован удобно, просто и не зависит от СУБД. При этом NHibernate поддерживает bulk insert только у Microsoft SQL Server'а, поскольку эта функциональность упирается в возможности нижележащего ADO.NET Data Provider'а.&lt;br /&gt;&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-88491948562139195?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/88491948562139195/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=88491948562139195' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/88491948562139195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/88491948562139195'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/10/sqlalchemy-for-python-some-queries.html' title='SQLAlchemy for Python. Some queries examples including generated SQL'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-874306459325523157</id><published>2011-09-30T10:09:00.000-07:00</published><updated>2011-09-30T10:17:13.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Кто собирал Twisted для Python под Windows 64 bit?</title><content type='html'>Фух. Сегодня выдался нелегкий денек...&lt;br /&gt;&lt;br /&gt;Оказалось что фреймверк Twisted не собран под Windows 64.  Пробовали MinGW, потом MinGW 64, потом Cygwin, потом MSVC. К сожалению  пока так ничего и не получилось :(&lt;br /&gt;&lt;br /&gt;Ознакомились с модулем logging. Нашли библиотеку которая позволит  отправлять логи на нашу любимую Log2Console в формате log4j XML.&lt;br /&gt;&lt;br /&gt;Продолжали разбираться с SQLAlchemy ORM фреймверком. Оказывается он  умеет делать bulk delete/update, чего не умеет делать даже NHibernate.&lt;br /&gt;&lt;br /&gt;В понедельник еще попробую помучать Twisted, есть еще одна идея как его собрать под Windows 64 bit...&lt;br /&gt;&lt;br /&gt;Если удастся собрать, то тогда будет возможность посмотреть на &lt;a href="http://code.google.com/p/python-loggingserver/"&gt;Python logging server&lt;/a&gt;, собственно ради него и затеяли эту возню с Twisted :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-874306459325523157?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/874306459325523157/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=874306459325523157' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/874306459325523157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/874306459325523157'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/09/twisted-python-windows-64-bit.html' title='Кто собирал Twisted для Python под Windows 64 bit?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-263595826366602827</id><published>2011-09-28T04:46:00.000-07:00</published><updated>2011-09-28T04:50:13.211-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><title type='text'>Извлечение файлов из .msi архивов</title><content type='html'>По определенным причинам я очень не люблю инсталляционные пакеты в Windows и предпочитаю работать с софтом в режиме "распаковал и запустил".&lt;br /&gt;&lt;br /&gt;Долгое время использовал прием описанный в этой статье:&lt;br /&gt;&lt;a href="http://thebackroomtech.com/2007/08/23/howto-extract-files-from-a-msi-file-using-the-windows-command-line/"&gt;Howto: extract files from a .msi file using the Windows command line&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Однако с помощью этой команды в некоторых случаях мне не удавалось распаковать файлы из .msi архива.&lt;br /&gt;&lt;br /&gt;Сегодня читая комментарии на StackOverflow наткнулся на проект lessmsi.&lt;br /&gt;&lt;br /&gt;Пост на StackOverflow:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/4205763/how-can-i-manually-install-the-office-2007-pias-on-a-computer-with-no-office-inst"&gt;how can I manually install the Office 2007 PIAs on a computer with no Office installed?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;lessmsi - A tool to view and extract the contents of an Windows Installer (.msi) file:&lt;br /&gt;&lt;a href="http://code.google.com/p/lessmsi/"&gt;http://code.google.com/p/lessmsi/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Пока не пробовал его в работе, но подумал, вдруг кому пригодится.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-263595826366602827?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/263595826366602827/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=263595826366602827' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/263595826366602827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/263595826366602827'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/09/msi.html' title='Извлечение файлов из .msi архивов'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8981923716240657353</id><published>2011-09-08T13:27:00.000-07:00</published><updated>2011-09-08T15:59:26.121-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Погружаясь в разработку на Python...</title><content type='html'>Последнее время промышляю написанием скриптов, которые автоматиризуют различные рутиные операции:&lt;br /&gt;- правка файлов AssemblyInfo.cs с целью внесения build number, git branch name, git commit hash&lt;br /&gt;- компиляция Visual Studio 2010 solution с проектами на C#/.NET 4.0&lt;br /&gt;- анализ кода с помощью утилиты Gendarme&lt;br /&gt;- подготовка deployment архивов, в которые складываем все бинарники за исключением XML-файлов с документационными комментариями, временных файлов, лог-файлов&lt;br /&gt;- сбор всех тикетов Redmine  для текущего билда и внесение соответсвующего комментария в каждый из этих тикетов&lt;br /&gt;&lt;br /&gt;Планирую еще добавить запуск NUnit тестов в связке с PartCover,  подготовку Test Code Coverage отчета в HTML-формате. &lt;br /&gt;&lt;br /&gt;Сейчас Code Coverage метрики мы вообще не собираем - никак не дойдут руки добавить, а запуск NUnit тестов для нас делает TeamCity.&lt;br /&gt;&lt;br /&gt;Хочу прийти к тому чтобы разработчик или QA имел возможность локально запустить билд скрипт, который бы выполнил всю ту же работу, которая происходит на CI-сервере TeamCity.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Какое-то время я размышял об инструменте, который можно использовать для этих целей и в итоге остановился на CPython.&lt;br /&gt;&lt;br /&gt;Среди кандидатов еще рассматривались Cygwin + Bash, PowerShell, IronRuby + Rake, IronPython.&lt;br /&gt;&lt;br /&gt;Cygwin + Bach кроссплатформенные, однако язык Bash за счет своей долгой истории развития выглядит достаточно несогласованным в плане синтаксиса. На нем не очень удобно писать императивный код и я не видел чтобы кто-то использовал там дебаггер.&lt;br /&gt;&lt;br /&gt;PowerShell напротив, отличается очень хорошей синтаксической согласованностью. У этого языка отличная интеграция с платформой Windows и .NET, что для меня как .NET разработчика неоспоримое преимущество. К тому же мне удалось найти редактор скриптов с отладчиком. Но все таки мне хотелось иметь возможность писать императивный код средней сложности, который был бы кроссплатформенным.&lt;br /&gt;&lt;br /&gt;IronRuby + Rake можно расценивать как готовую билд систему с хорошим императивным языком. Если бы у меня не было работы с язком Pyhton, то, возможно, я бы выбрал именно этот вариант.&lt;br /&gt;&lt;br /&gt;Python думаю не нужен в особой рекламе. Достаточно сказать что я его выбрал :) Ну а если серьезно, язык я выбрал для решения поставленных задач из-за того что он довольно популярен, решает задачи общего назначения, кросплатформенный, используется для разработки как Desktop так и Web-решений. Так же его используют для нетривиальных задач системного администрирования, которые не может "вытянуть" Bash. Наверное переломным для меня моментом была находка библиотеки Paver, которая судя по всему делает все то же, что и библиотека Rake.&lt;br /&gt;&lt;br /&gt;На первых этапах разработка велась с использованием IronPython + paver + Visual Studio 2010 + Python Tools for Visual Studio 2010 beta, позже на CPython 2.7 + paver + concurrent.futures + lxml + Eclipse + PyDev. Сейчас присматриваюсь к среде разработки JetBrains PyCharm, хотя использование коммерческого продукта для подобных задач кажется расточительным.&lt;br /&gt;&lt;br /&gt;По состоянию на сегодняшний день build/deplyment скрипты представляют из себя сборную солянку следующих библиотек:&lt;br /&gt;- &lt;a href="http://paver.github.com/paver/"&gt;paver&lt;/a&gt;, BSD&lt;br /&gt;- &lt;a href="http://docs.python.org/dev/library/concurrent.futures.html"&gt;concurrent.futures&lt;/a&gt;, BSD&lt;br /&gt;- &lt;a href="http://lxml.de/"&gt;lxml&lt;/a&gt;, BSD&lt;br /&gt;- &lt;a href="https://github.com/benoitc/restkit/"&gt;py-restkit&lt;/a&gt;, BSD&lt;br /&gt;- &lt;a href="http://simplejson.readthedocs.org/en/latest"&gt;simplejson&lt;/a&gt;, MIT&lt;br /&gt;- &lt;a href="https://github.com/benoitc/http-parser/"&gt;http-parser&lt;/a&gt;, MIT&lt;br /&gt;&lt;br /&gt;Так же я обращал внимание на следующие библиотеки:&lt;br /&gt;- &lt;a href="https://github.com/gitpython-developers/GitPython"&gt;GitPython&lt;/a&gt;, BSD, работает, но не понадобилась&lt;br /&gt;- &lt;a href="http://code.google.com/p/pyactiveresource/"&gt;PyActiveResource&lt;/a&gt;, MIT, не подошла из-за функциональных ограничений&lt;br /&gt;- &lt;a href="http://code.google.com/p/python-rest-client/"&gt;python-rest-client&lt;/a&gt;, GPLv3, не пробовал из-за лицензионных ограничений&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8981923716240657353?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8981923716240657353/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8981923716240657353' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8981923716240657353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8981923716240657353'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/09/python.html' title='Погружаясь в разработку на Python...'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-9171551999692638242</id><published>2011-08-17T15:12:00.000-07:00</published><updated>2011-08-17T16:37:42.134-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reading'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Цитаты из книги "Программист-прагматик. Путь от подмастерья к мастеру"</title><content type='html'>На прошлой неделе закончил читать книгу  Эндрю Ханта и Дэвида Томаса "&lt;a href="http://www.ozon.ru/context/detail/id/1657382/"&gt;Программист-прагматик. Путь от подмастерья к мастеру&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Читал книгу в формате &lt;a href="http://ru.wikipedia.org/wiki/FictionBook"&gt;FictionBook&lt;/a&gt; на своем смартфоме &lt;a href="http://www.mobile-review.com/review/samsung-galaxy-s.shtml"&gt;Samsung Galaxy S&lt;/a&gt; с помощью замечательной программы-читалки &lt;a href="http://coolreader.org/"&gt;Cool Reader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Впечатления очень положительные. Изложение в книге не сложное, так как там практически отсутствуют точные технические сведения, как это часто бывает в нашей технической литературе. &lt;br /&gt;&lt;br /&gt;Авторы раскрывают скорее принципы, которыми должен руководствоваться любой программист в своей повседневной работе.&lt;br /&gt;&lt;br /&gt;Крайне рекомендую прочитать эту книгу любому программисту, независимо от его уровня. Начинающий разработчик найдет для себя целый срез полезных знаний, опытный разработчик также с очень большой вероятностью найдет для себя что-то новое.&lt;br /&gt;&lt;br /&gt;Лично мне читать эту книгу было крайне легко, так как большую часть вещей изложенных в книге я уже использую в своей повседнемной работе. Очень понравилась компактность изложения и столь большое количество системных советов, которыми могут руководствоваться разработчики независимо от их профиля и выбранной платформы.&lt;br /&gt;&lt;br /&gt;Ниже привожу цитаты из книги, которые мне понравились.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;(Об управлении временем жизни у зависимых объектов)&lt;br /&gt;&lt;br /&gt;Есть три основных варианта развития событий:&lt;br /&gt;1. Структура верхнего уровня также несет ответственность за освобождение любых входящих в нее подструктур. Затем эти структуры рекурсивно удалят данные, содержащиеся в них, и т. д.&lt;br /&gt;2. Структура верхнего уровня просто освобождается. Любые структуры, на которые она указывает (и на которых нет других ссылок), становятся "осиротевшими".&lt;br /&gt;3. Структура верхнего уровня отказывается освобождать себя, если в нее входят какие-либо подструктуры&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Хотя принцип "модель-визуальное представление-контроллер" обычно реализуется в контексте графического интерфейса, на самом деле он является универсальной методикой программирования. Визуальное представление – это некая интерпретация модели (возможно, подмножества), и она не обязана быть графической. Контроллер в большей части является механизмом координации и не должен ассоциироваться с устройством ввода любого типа.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Подсказка 24: Занимайтесь устранением проблемы, а не обвинениями&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Программное обеспечение работает несколько по-иному. В отличие от строительства, написание программ ближе к садоводству, оно ближе к живой природе, чем к бетонным конструкциям. Вы высаживаете в саду множество растений согласно первоначальному плану и условиям. Некоторые растения разрастаются, другим же уготована компостная яма. Вы можете пересаживать растения друг относительно друга, чтобы извлечь пользу из взаимодействия света и тени, ветра и дождя. Переросшие растения разрубают или обрезают, растения определенного цвета пересаживают на другие участки, где они становятся более приятными глазу с точки зрения эстетики. Вы выпалываете сорняки и подкармливаете растения, которые нуждаются в дополнительном питании. Вы постоянно следите за состоянием сада и при необходимости вносите изменения (в почву, растения, общий план)&lt;br /&gt;&lt;br /&gt;Метафора садоводства намного ближе к реальности разработки программного обеспечения. Возможно, некая программа переросла себя или пытается осуществить слишком много – ее необходимо разбить на две. Все, что не получается в соответствии с планом, подлежит прополке или обрезке.&lt;br /&gt;&lt;br /&gt;Попробуйте объяснить этот принцип вашему шефу, пользуясь аналогией с медициной: рассматривайте программу, нуждающуюся в реорганизации,реорганизации, как «опухоль». Чтобы удалить ее, требуется хирургическое вмешательство. Вы можете начать сразу и извлечь ее, пока она небольшая. Но если вы будете ждать, пока она вырастет и распространится, то ее удаление станет более дорогой и опасной процедурой. Подождите еще, и вы можете потерять пациента окончательно.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Многие книги и учебные пособия относят процедуру сбора исходных требований к начальной фазе проекта. Термин «сбор» напоминает о племени счастливых аналитиков, занимающихся собирательством камней-самородков мудрости, разбросанных по земле на фонеприглушенного звучания "Пасторальной симфонии". Этот термин напоминает о том, что все требования уже имеются в наличии, нужно лишь отыскать их, положить в корзину и весело шагать дальше.&lt;br /&gt;Это не совсем так. Требования редко лежат на поверхности. Обычно они находятся глубоко под толщей предположений, неверных представлений и политики.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Важно обнаружить основополагающую причину того, почему пользователи поступают определенным образом, а не так, как они привыкли это делать. В конечном итоге разрабатываемой программе придется решать проблемы их бизнеса, а не просто отвечать их заявленным требованиям.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Вы отклонились от графика выполнения проекта или уже отчаялись увидеть систему работающей, поскольку конкретную проблему "невозможно решить". В этот момент необходимо сделать шаг назад и задать себе несколько вопросов:&lt;br /&gt;• Существует ли более простой способ?&lt;br /&gt;• Вы пытаетесь решить главную проблему или отвлекаетесь на второстепенные технические детали?&lt;br /&gt;• Почему это является проблемой?&lt;br /&gt;• Что делает эту проблему столь сложной для решения?&lt;br /&gt;• Стоит ли делать это именно таким образом?&lt;br /&gt;• Стоит ли это делать вообще?&lt;br /&gt;И во многих случаях секрет удивительным образом раскроется перед вами, как только вы попробуете ответить на один из этих вопросов.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Подсказка 59: Дорогие инструменты не всегда создают лучшие решения&lt;br /&gt;&lt;br /&gt;Конечно, в разработке программ есть место формальным методам. Однако, столкнувшись с проектом, философия которого заключается в изречении "диаграмма класса и есть приложение, все остальное – лишь механическое составление текста программы", знайте, что имеете дело с проектной командой, которая уцепилась за плавучее бревно и медленно гребет к берегу.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;В группе L Стоффел руководит шестью первоклассными программистами – это руководящая работа, которую можно приравнять к управлению бродячими котами.&lt;br /&gt;Журнал "Washington Post" от 9 июня 1985 г.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Подсказка 66: Дефект должен обнаруживаться единожды&lt;br /&gt;&lt;br /&gt;Если дефект проскальзывает через сеть существующих тестов, вам необходимо добавить новый тест, чтобы поймать его в следующий раз.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;В абстрактном смысле приложение успешно, если оно корректно реализует свои спецификации. К сожалению, это и оплачивается лишь абстрактно.&lt;br /&gt;В действительности успех проекта измеряется тем, насколько он соответствует надеждам своих пользователей. Проект, не оправдавший их надежд, обречен на неудачу, неважно, насколько хорошо он соответствовал срокам.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;Программисты-прагматики не уклоняются от ответственности. Вместо этого они испытывают радость, принимая вызовы и распространяя свой опыт. Если мы несем ответственность за проектное решение или фрагмент программы, мы делаем работу, которой можем гордиться.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;$(document).ready(function() { $('cite:nth-child(odd)').wrap('&lt;div /&gt;'); $('cite:nth-child(even)').wrap('&lt;div style="padding:0 0 0 30px" /&gt;'); });&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-9171551999692638242?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/9171551999692638242/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=9171551999692638242' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/9171551999692638242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/9171551999692638242'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/08/blog-post.html' title='Цитаты из книги &quot;Программист-прагматик. Путь от подмастерья к мастеру&quot;'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3220780791800657468</id><published>2011-03-20T11:35:00.000-07:00</published><updated>2011-03-20T14:37:41.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Holywars'/><title type='text'>Сегодня Windows 7 довел меня до белого каления</title><content type='html'>На системном разделе моего ноутбука объем которого составляет 25 Гб (!) нехватает свободного места. Точнее там тупо ноль байт. Из-за этого масса проблем.&lt;br /&gt;&lt;br /&gt;В качестве решения проблемы решил перенести c:\Program Files\ и c:\Program Files (x86)\ на другой раздел и сделать Junction Point.&lt;br /&gt;&lt;br /&gt;Скопировал все содержимое, но теперь не могу удалить каталог и поменять права, даже с правами администратора. &lt;br /&gt;&lt;br /&gt;Администратор не имеет права на удаление этого каталога, только TrustedInstaller и Local System имеет право удалить этот каталог.&lt;br /&gt;&lt;br /&gt;Запустить cmd сессию от Local System аккаунта можно с помощью PsTools\PsExec. Но они не работают из-за какого-то дефекта в 64-редакции Windows 7.&lt;br /&gt;&lt;br /&gt;Есть хотфик, который решает эту проблему, но чтобы его скачать нужно ввести свой email и капчу. Терпение на исходе.&lt;br /&gt;&lt;br /&gt;На почтовый ящик пришло письмо с прямой ссылкой и паролем. Скачал, распаковал. После чего получил сообщение что hotfix не может быть установлен.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если посмотреть на проблему изначально - 25 Гб под системный раздел для ноутбука это много или мало по состоянию на 2011 год?&lt;br /&gt;&lt;br /&gt;Чтобы картина была более ясна отмечу что в каталог c:\Users я не сохраняю никаких своих документов.&lt;br /&gt;&lt;br /&gt;Весь установленный софт занимает не так уж и много места:&lt;br /&gt;&lt;br /&gt;305 Мб - C:\Program Files\ &lt;br /&gt;441 Мб - C:\Program Files (x86)\&lt;br /&gt;1,31 Гб - C:\soft\  причем этот каталог можно не считать, так как все данные лежат на другом разделе, а это Junction Point.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Иногда я жалею что я .NET разработчик, который зависит от операционной системы Windows. &lt;br /&gt;&lt;br /&gt;Если бы я в повседневной работе использовал только кроссплатформенные решения, то у меня хотя бы был выбор...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;: Удалось найти достаточно простое решение моей проблемы вот тут&lt;br /&gt;&lt;a href="http://helpdeskgeek.com/windows-7/windows-7-how-to-delete-files-protected-by-trustedinstaller/"&gt;http://helpdeskgeek.com/windows-7/windows-7-how-to-delete-files-protected-by-trustedinstaller/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3220780791800657468?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3220780791800657468/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3220780791800657468' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3220780791800657468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3220780791800657468'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/03/windows-7.html' title='Сегодня Windows 7 довел меня до белого каления'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6384786650039666852</id><published>2011-02-05T11:37:00.000-08:00</published><updated>2011-02-05T11:46:27.738-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>The very first .NET Saturday in IT Café_</title><content type='html'>Сегодня, пятого февраля сходил на событие, проходящее под эгидой компании Ciklum, которое называется .NET Saturday.&lt;br /&gt;&lt;br /&gt;В большинстве случаев заметки в свой блог мне писать очень и очень лень, но тут решил написать буквально пару строк о прошедшем событии.&lt;br /&gt; &lt;br /&gt;Формат события такой. В обычном, но довольно привлекательном кафе освобождают часть зала, в зоне которого находится докладчик, все слушатели сидят прямо за своими столиками и слушают доклад. Один за другим идет ряд докладов с 15-ти минутными перерывами между ними. В перерыве между докладами можно попить чаю, кофе, поесть печеньки или конфеты.&lt;br /&gt;&lt;br /&gt;Были прочитаны следующие доклады:&lt;br /&gt;- Александр Краковецкий (Винница, head of  MS User Group) «Тестирование производительности .NET приложений»;&lt;br /&gt;- Дмитрий Пасько (Харьков, Team Leader) «NuGet- package management for the .NET platform»;&lt;br /&gt;- Андерс Соренсен (Дания, Site manager) «Optimizing development in an offshore context»;&lt;br /&gt;- Михаил Вальков (Харьков, Senior .net developer) «Antipatterns»&lt;br /&gt;&lt;br /&gt;Мероприятие продолжалось с 15:00 по 19:00 и количество времени выделенного на каждый доклад было достаточным.&lt;br /&gt;&lt;br /&gt;Признаюсь, что решение идти на это мероприятие меня в первую очередь натолкнула тема первого доклада, хотя после окончания мероприятия лично для меня оказались самыми интересными доклад Дмитрия Пасько по NuGet и доклад Андерса Соренсена.&lt;br /&gt;&lt;br /&gt;Искренне благодарю всех докладчиков за их труд и время. Это очень ценно, когда человек находит желание и силы поделиться своими знаниями с локальным сообществом. В этом отношении мне несколько стыдно, поскольку я бы наверное тоже мог бы поделиться определенными вещами с коллегами по работе в рамках того или иного доклада, но до сих пор я себя так и не смог заставить это сделать.&lt;br /&gt;&lt;br /&gt;Хотелось бы еще отметить, что формат этого мероприятия мне крайне понравился. Его продолжительность была не маленькой, но при этом я ушел оттуда не уставшим, а может быть даже отдохнувшим. Возможность попить чаю прямо посередине прослушивания доклада, выйти на улицу в перерыв для того чтобы проветрить мозги – все это было очень кстати. Сами столики очень расслабляли и наталкивали на дискуссию, хотя я бы не отказался от более длинного перерыва, чтобы успеть и проветриться и успеть похоливарить с товарищами за столиком.&lt;br /&gt;&lt;br /&gt;Компания Ciklum планирует проводить подобные мероприятия около одного раза в месяц по субботам. Если вы вдруг узнаете о данном мероприятии, то рекомендую на него сходить хотя бы один раз для пробы.&lt;br /&gt;&lt;br /&gt;На всякий случай отмечу, что я не работаю в Ciklum и не имею к компании никакого отношения даже не смотря на то, что по моей «вине» на это мероприятие пришло пять моих товарищей. :) Ребята, надеюсь что вам там тоже понравилось.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6384786650039666852?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6384786650039666852/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6384786650039666852' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6384786650039666852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6384786650039666852'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2011/02/net-saturday-in-it-cafe.html' title='The very first .NET Saturday in IT Café_'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-542309587603236493</id><published>2010-09-02T17:45:00.000-07:00</published><updated>2010-09-02T18:12:54.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='News'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Вышел Castle.Windsor (включая Core, DynamicProxy, DictionaryAdapter) версии 2.5</title><content type='html'>Ура товарищи. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://kozmic.pl/archive/2010/08/22/castle-windsor-incl.-core-with-dynamicproxy-and-dictionary-adapter-v2.5.aspx"&gt;Вышел&lt;/a&gt; стабильный релиз &lt;a href="http://www.castleproject.org/container/index.html"&gt;Castle.Windsor&lt;/a&gt;, который я со спокойной совестью теперь могу рекомендовать даже начинающим ЙОК-овцам (IoC, &lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F"&gt;Inversion of Control&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В &lt;a href=" http://kozmic.pl/archive/2010/07/05/castle-windsor-2.5hellip-the-final-countdown-ndash-beta-1-released.aspx"&gt;анонсе&lt;/a&gt; бета релиза была масса отличных новостей:&lt;br /&gt;- объединили Castle.Core, Caste.DynamicProxy, Castle.DictionaryAdapter в Castle.Core&lt;br /&gt;- объединили Castle.MicroKernel, Castle.Windsor в Castle.Windsor&lt;br /&gt;- сделали ряд незначительных breaking changes (читал описание, там все очень экзотическое и редко используемое). Можно было бы более крепко пройтись по старому API&lt;br /&gt;- весь устаревший API отметили как obsolete. До этого там была настоящая каша. Прямо как в Rhino.Mocks&lt;br /&gt;&lt;br /&gt;Castle объединяет сборки, а (Microsoft) Unity декомпозирует. ...ребята которые пидалят Unity не ведают что творят :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;К счастью основная проблема с высоким порогом вхождения была решена - благодаря тому что методы были отмечены как obsolete, новички не будут выносить себе мозг в поисках того какие именно методы стоит использовать, а какие не стоит. Более того, разработчики обещают вообще удалить все obsolete методы в релизе 3.0.&lt;br /&gt;&lt;br /&gt;До релиза 2.5, когда у меня спрашивали что лучше использовать в качестве IoC контейнера, я постоянно колебался в ответе. Обычно рекомендовал смотреть либо на Castle.Windsor либо на &lt;a href="http://code.google.com/p/autofac/"&gt;Autofac&lt;/a&gt; и говорил что если будут малейшие сложности с Castle.Windsor, то не морочить с ним долго голову.&lt;br /&gt;&lt;br /&gt;Теперь же однозначно уверен что логичнее использовать Caslte.Windsor, а легкий Autofac стоит использовать только лишь в Silverlight проектах.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Пользуясь случаем приглашаю всех пользователей Caslte.Windsor "приложиться" к его улучшению, оставив свои предложения на фидбек сайте. Команда разработчиков реально прислушивается к пожеланиям их пользователей:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://castle.uservoice.com/forums/38955-windsor-v3/suggestions/508913-provide-more-compact-discoverable-fluent-api"&gt;Provide more compact, discoverable fluent API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В качестве примера &lt;a href="http://kozmic.pl/archive/2010/08/25/upgrading-to-windsor-2.5-northwind.aspx"&gt;тут&lt;/a&gt; хорошо расписаны шаги миграции проекта S#arp Architecture на последнюю версию Castle.&lt;br /&gt;&lt;br /&gt;Указывается как разрешить проблему зависимости NHibernate и Castle.Windsor на Castle.DynamicProxy, которая переехала в Castle.Core.&lt;br /&gt;&lt;br /&gt;Описывается рефакторинг со старого API на новый API Castle.Windsor. Много внимания уделяется IWindsorInstaller, который мне очень понравился.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ЗЫ Да, я знаю что релиз как-бы вышел с пол месяца назад, но у меня таймауты... Уж простите :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-542309587603236493?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/542309587603236493/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=542309587603236493' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/542309587603236493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/542309587603236493'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2010/09/castlewindsor-core-dynamicproxy.html' title='Вышел Castle.Windsor (включая Core, DynamicProxy, DictionaryAdapter) версии 2.5'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8916614810145950964</id><published>2010-08-11T16:23:00.000-07:00</published><updated>2010-08-11T16:55:19.644-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>Полиглотное программирование в .NET это хорошо. История внедрения IronPython</title><content type='html'>&lt;a href="http://nesteruk.wordpress.com/2010/08/02/dot-net-polyglot-programming/"&gt;Неплохая статья&lt;/a&gt;. Выгодно отличается трезвым взглядом человека-практика.&lt;br /&gt;&lt;br /&gt;Признаюсь что читать все комментарии сил не нашел, но хотелось бы оставить одну галочку в Success Stories исключительно для статистики. :)&lt;br /&gt;&lt;br /&gt;Уже несколько лет работаю на одном большом проекте в котором с самого начала присутствовал скриптинг.&lt;br /&gt;&lt;br /&gt;Причем начиналось это все с написания скриптов общего назначения на NVelocity и это был сущий ад, поскольку Velocity ну никак не является скриптовым языком общего назначения.&lt;br /&gt;&lt;br /&gt;Но это было время .NET 1.1, IronPython'а тогда еще не было, а нам нужна была возможность написания скриптов, которые бы вызывались во время отработки различных фабричных методов.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В какой-то момент мы нашли проект IronPython и начиная с версии 1.0 RC я был человеком, который "двигал" этот язык и передавал опыт работы другим командам внутри нашего проекта.&lt;br /&gt;&lt;br /&gt;Все это происходило медленно, но верно. По ходу дела я переезжал с одного релиза на другой, решая разного рода проблемы взаимодействия C# и IronPython при хостинге DLR внутри C# приложения.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вначале были переписаны скрипты с NVelocity на IronPython практически один-в-один. Разве что я старался скрипты представлять в более организованном, процедурном виде ну и использовать простейшие возможности языка.&lt;br /&gt;&lt;br /&gt;Следующим этапом был постепенный перевод всех скриптов на более высокоуровневую объектную модель. Тут пришлось пройтись по некоторым не очевидным граблям, которые выплывали во время наследования абстрактных классов C# в типах, которые я реализовывал на языке Python.&lt;br /&gt;&lt;br /&gt;В конечном счете теперь у нас на проекте появляется все больше и больше скриптов на IronPython, которые постепенно становятся все более "умными".&lt;br /&gt;&lt;br /&gt;При этом, скажу что мы, как суровые челябинские разработчики, пишем без IntelliSense и без отладчика. Спасает то, что я разобрался как можно вытащить script stack trace. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В конечном счете я для себя сделал такой вывод: &lt;br /&gt;&lt;br /&gt;Многоязыковость платформы .NET это однозначно хорошо, так как позволяет в определенных ситуациях находить отличные решения. И мне кажется что эта самая многоязыковость или даже "распыленность" Microsoft по C#/F#/VB.NET/IronPython/IronRuby вряд ли нанесет существенный вред платформе в целом и языку C# в частности.&lt;br /&gt;&lt;br /&gt;Другое дело что от такого обилия языков программирования бедный разработчик теряется, но это уже проблемы этого разработчика. Кто-то пусть делает ставку на проверенную лошадку, кто-то пусть экспериментирует. Главное что всем хватает места и это очень радует.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8916614810145950964?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8916614810145950964/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8916614810145950964' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8916614810145950964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8916614810145950964'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2010/08/net-ironpython.html' title='Полиглотное программирование в .NET это хорошо. История внедрения IronPython'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-981612474888181123</id><published>2010-04-03T10:22:00.000-07:00</published><updated>2010-04-03T10:28:08.969-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Inversion of Control and Dependency Injection. Ссылки</title><content type='html'>Inversion of Control and Dependency Injection: Working with Windsor Container&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa973811.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa973811.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ознакомительная статья, раскрывающая основные концепции Inversion of Control и Dependency Injection, которую написал Oren Eini aka Ayende Rahien. Носит предельно практических характер. Достаточно много хорошего материала, все изложение идет в ключе разработки некоего приложения (или сервиса) по обработке заказов. Крайне рекомендую эту статью к прочтению.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Inversion of Control and Dependency Injection with Castle Windsor Container. Four Parts.&lt;br /&gt;Цикл статей об использовании Inversion of Control и Dependency Injection с помощью популярного фреймверка Castle.Windsor.&lt;br /&gt;&lt;a href="http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart1.aspx"&gt;http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart1.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Первая статья является вводной. Вначале статьи приводится пример кода в котором нарушается принцип разделения ответственности (Separation of concerns) и который написан без оглядки на Unit-тестирование. Затем приводится реализация кода с использованием принципа обращения зависимостей (Inversion of Control), а точнее с помощью Constuctor [Dependency] Injection. Вторая версия удобна с точки зрения тестирования, но не удобна в реальном использовании, так как клиент будет знать сразу о нескольких реальных типах. И заключительной части показывается использование IoC/DI контейнера, точнее его базовой части в виде Castle.MicroKernel API, а затем и в расширенной - Castle.Windsor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart2.aspx"&gt;http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart2.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Во второй части рассматриваются инъекция опциональных зависимостей (Property Injection), приводится пример инъекции конкретной реализации (имеет смысл, когда на один и тот же интерфейс может быть несколько реализаций). В конце статьи приводятся примеры декларативного Xml конфигурирования основных коллекций - Array, IList&lt;T&gt;, IDictionary&lt;K, V&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart3.aspx"&gt;http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart3.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;В третьей части показывается пример вынесения части конфигурации в отдельные разделы Xml конфигурации Castle.Windsor и включение этих параметров при декларировании сервисов. По простым примерам видно, насколько просто и одновременно мощно можно конфигурировать сервисы Castle.Windsor с помощью конфигурационного файла. Если нужно задать значение параметра, который имеет сложный пользовательский тип, то это можно сделать с помощью TypeConverter'а. Приводится, не совсем полезный пример реализации декоратора и его регистрации. Возможно это сделано для того чтобы потом можно было привести пример с define и if/else прямо внутри конфигурационного файла.&lt;br /&gt;Всех описанных возможностей конфигруации хватит за глаза любому, даже самому энтерпрайзному приложению :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart4.aspx"&gt;http://dotnetslackers.com/articles/designpatterns/InversionOfControlAndDependencyInjectionWithCastleWindsorContainerPart4.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;В четвертой части описывается крайне важный материал - управление жизненным циклом сервисов внутри Castle.Windsor контейнера.&lt;br /&gt;Любому, кто собирается работать с Caslte.Windsor стоит обязательно разобраться в том, что такое Lifestyle, Lifecycle, Commision/Decomission и Release Policy. Чтобы не было неожиданно неприятных ситуаций как со мной и Web-приложением на production сервере :)&lt;br /&gt;Информация по Facility довольно полезна, но не так критична.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Building the Policy Injection in 40 Minutes with Windsor&lt;br /&gt;&lt;a href="http://ayende.com/Blog/archive/2007/03/07/Building-the-Policy-Injection-in-40-Minutes-with-Windsor.aspx"&gt;http://ayende.com/Blog/archive/2007/03/07/Building-the-Policy-Injection-in-40-Minutes-with-Windsor.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Реализация Policy Injection в виде Facility для Castle.Windsor. Типичный пример аспект-ориентированного программирования. Не знаю кто придумал термин Policy Injection, и что конкретно он обозначает, но когда мне говорят реализация аспекта (AOP), то я сразу понимаю о чем идет речь.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Caching with Castle Windsor&lt;br /&gt;&lt;a href="http://consultingblogs.emc.com/owainwragg/archive/2008/10/31/caching-with-castle-windsor.aspx"&gt;http://consultingblogs.emc.com/owainwragg/archive/2008/10/31/caching-with-castle-windsor.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Реализация Facility, которая обеспечивает кеширование данных используя аспект-ориентированный подход. Очевидно, что с помощью IoC и AOP-подхода можно достаточно удобно решать такие вещи как Security, Logging, Caching.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The joys of Castle.Services.Transaction&lt;br /&gt;&lt;a href="http://www.jroller.com/hammett/entry/the_joys_of_castle_services"&gt;http://www.jroller.com/hammett/entry/the_joys_of_castle_services&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Описывается использование AutomaticTransactionFacility. Просто апофеоз декларативной attribute-driven разработки. Выглядит настолько необычно что я даже не знаю, стоит ли пытаться повторить это дома :)  В любом случае идея невероятно креативная.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hidden jewels in the Castle stack: Transaction Services&lt;br /&gt;&lt;a href="http://blogs.taiga.nl/martijn/2008/12/03/hidden-jewels-in-the-castle-stack-transaction-services"&gt;http://blogs.taiga.nl/martijn/2008/12/03/hidden-jewels-in-the-castle-stack-transaction-services&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Прошу меня простить, но эта ссылка уже реальный оффтопик основной темы. В посте развивается идея сервиса транзакций из проекта Castle, только теперь транзакционность пытаются прикрутить уже к файловой системе...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;List of .NET Dependency Injection Containers (IOC)&lt;br /&gt;&lt;a href="http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx"&gt;http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Достаточно обширная подборка IoC контейнеров на платформе .NET от Scott Hanselman'а.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BitterCoder's Wiki. Container Tutorials&lt;br /&gt;&lt;a href="http://wiki.bittercoder.com/Default.aspx?Page=ContainerTutorials&amp;AspxAutoDetectCookieSupport=1"&gt;http://wiki.bittercoder.com/Default.aspx?Page=ContainerTutorials&amp;AspxAutoDetectCookieSupport=1&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Коллекция ссылок на туториалы по Castle.Windsor, в настоящее время представлено четырнадцать частей. Специфика этих туториалов заключается в том, что там в каждой части раскрывается только одна функциональная возможность библиотеки. Возможно для кого-то такой дробный формат изложения покажется удобным.&lt;br /&gt;&lt;br /&gt;Внизу страницы приведена целая коллекция ссылок по рассматриваемой тематике на различные сторонние ресурсы.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Inject Some Life into Your Applications—Getting to Know the Unity Application Block&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc816062.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc816062.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Вводная статья по Unity, IoC контейнеру, который разрабатывался силами Microsoft и затем был выпущен с открытым исходным кодом. Рассматриваются основные аспекты IoC контейнера. Все примеры кода приведены сразу на двух языках - C# и VB.NET.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IoC libraries compared&lt;br /&gt;&lt;a href="http://elegantcode.com/2009/01/07/ioc-libraries-compared/"&gt;http://elegantcode.com/2009/01/07/ioc-libraries-compared/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Сравнение API у различных IoC контейнеров: Ninject, StructureMap, Unity, Spring.net, Castle.Windsor, Autofac. Следует принять во внимание что статья написана в январе 2009 года, а API каждого из перечисленный фреймверков постоянно совершенствуется.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Две простейшие реализации IoC контейнеров. По их реализации можно сделать вывод о том, какая основная задача ставится перед таким контейнером.&lt;br /&gt;&lt;br /&gt;It's My Turn To Build An IoC Container In 15 Minutes and 33 Lines&lt;br /&gt;&lt;a href="http://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx"&gt;http://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Building an IoC container in 15 lines of code&lt;br /&gt;&lt;a href="http://ayende.com/Blog/archive/2007/10/20/Building-an-IoC-container-in-15-lines-of-code.aspx"&gt;http://ayende.com/Blog/archive/2007/10/20/Building-an-IoC-container-in-15-lines-of-code.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-981612474888181123?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/981612474888181123/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=981612474888181123' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/981612474888181123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/981612474888181123'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2010/04/inversion-of-control-and-dependency.html' title='Inversion of Control and Dependency Injection. Ссылки'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6870962001395194409</id><published>2010-03-11T22:03:00.000-08:00</published><updated>2010-03-11T22:33:31.969-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QA'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>WatiN и ASP.NET integration tests</title><content type='html'>Не так давно пробовал библиотеку &lt;a href="http://watin.sourceforge.net/"&gt;WatiN&lt;/a&gt; в работе, впечатления очень положительные.&lt;br /&gt;&lt;br /&gt;На мой взгляд эту библиотеку очень выгодно отличает ее API. Он очень domain specific и его удобно использовать и читать.&lt;br /&gt;&lt;br /&gt;Так же очень логично использовать так называемый &lt;a href="http://watinandmore.blogspot.com/2009/06/introducing-page-class.html"&gt;"Page-based API"&lt;/a&gt;, когда каждая страница в сценарии инкапсулирована в отдельный класс, унаследованный от класса WatiN.Core.Page. В этом классе описывается мэппинг контролов страницы на определенные свойста класса с помощью атрибутов, а так же реализуется логика взаимодействия со страницей в методах класса.&lt;br /&gt;&lt;br /&gt;Реализованные классы страниц могут быть повторно использованы во множестве тестов с разными входными данными и с разными наборами страниц.&lt;br /&gt;Таким образом, при чтении теста тестировщик или разработчик концентрируется не на полях ввода и кнопках, а на бизнес-логике и логике взаимодействия с веб приложением.&lt;br /&gt;&lt;br /&gt;Классический API можно увидеть на главной странице сайта WatiN, я же приведу пример "Page-based API":&lt;pre class="prettyprint lang-cs"&gt;using (var ie = new IE("http://www.google.com"))&lt;br /&gt;{&lt;br /&gt; var page = ie.Page&amp;lt;GoogleSearchPage&amp;gt;();&lt;br /&gt; page.SearchFor("WatiN");&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;[Page(UrlRegex="www.google.*")]&lt;br /&gt;public class GoogleSearchPage : Page&lt;br /&gt;{&lt;br /&gt; [FindBy(Name="btnG")]&lt;br /&gt; public Button SearchButton;&lt;br /&gt;&lt;br /&gt; [FindBy(Name="q")]&lt;br /&gt; public TextField SearchCriteria;&lt;br /&gt;&lt;br /&gt; public void SearchFor(string searchCriteria)&lt;br /&gt; {&lt;br /&gt;  this.SearchCriteria.TypeText(searchCriteria);&lt;br /&gt;  this.SearchButton.Click();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Надеюсь что весь приведенный код не нуждается в комментариях. Если вы его сразу же поняли, значит этот API можно считать действительно удачным.&lt;br /&gt;&lt;br /&gt;Пример реального кода на WatiN:&lt;pre class="prettyprint lang-cs"&gt;browser = new IE(fedExHomePageUrl);&lt;br /&gt;browser.Page&amp;lt;FedExLoginPage&amp;gt;().LogIn(login, password);&lt;br /&gt;browser.GoTo(fedExSearchPageUrl);&lt;br /&gt;browser.Page&amp;lt;FedExSearchPage&amp;gt;().Search(dateFrom, dateTo);&lt;br /&gt;browser.Page&amp;lt;FedExSearchResultPage&amp;gt;().SaveAs(reportPath);&lt;br /&gt;browser.Page&amp;lt;FedExDownloadPage&amp;gt;().Download(browser, reportPath);&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В коде выше описан верхний уровень сценария взаимодействия с сайтом FedEx. Глядя на код можно получить четкое представление о том, что нужно сделать пользователю для того чтобы скачать некий репорт с сайта. При этом все ньюансы разметки страницы и ввода данных сгруппированы и изолированы :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WatiN даже умеет взаимодействовать со скрытым окном браузера, что позволяет запускать integration тесты на локальной машине прямо во время работы.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Стоит отметить, что в работе со скрытым окном браузера есть несколько ньюансов:&lt;br /&gt;&lt;br /&gt;1. Если понадобится сделать скриншот страницы, то окно браузера необходимо сделать видимым, но не активным, иначе вместо скриншота у нас будет снимок черного экрана. Окно можно делать не активным, чтобы оно не мешало работе. После снятия скриншота окно можно будет сразу же спрятать:&lt;pre class="prettyprint lang-cs"&gt;browser.ShowWindow(NativeMethods.WindowShowStyle.ShowNormalNoActivate);&lt;br /&gt;browser.CaptureWebPageToFile(debugImagePath);&lt;br /&gt;browser.ShowWindow(NativeMethods.WindowShowStyle.Hide);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Обработка диалоговых окон часто завершается неудачей без видимых на то причин. К сожалению у меня не было достаточно времени чтобы четко вычислить закономерность поведения, поэтому я проблему решил приведением окна браузера в видимый + активный режим. Понятно что побочным эффектом будет периодические появления диалоговых окон в самый неудачный для вас момент, но как правило таких ситуаций не так уж и много. Буду очень признателен, если кто-нибудь подскажет решение данной проблемы.&lt;br /&gt;&lt;br /&gt;3. На моем копьютере WatiN отказывается работать в режиме Windows Service без доступа к рабочему столу, несмотря на то что на официальном сайте утверждается обратное.&lt;br /&gt;&lt;br /&gt;...случайно заметил что в IE8 все вставки кода выглядят просто ужасно. Что интересно, FF и iPhone показывают правильно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6870962001395194409?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6870962001395194409/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6870962001395194409' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6870962001395194409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6870962001395194409'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2010/03/watin.html' title='WatiN и ASP.NET integration tests'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-993479857635130450</id><published>2010-01-31T13:34:00.000-08:00</published><updated>2010-01-31T13:40:07.939-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Парсинг Html документов с целью извлечения данных</title><content type='html'>Ехал я как-то с работы вместе со своим коллегой Валерой Щербининым и заговорили о теме парсинга HTML.&lt;br /&gt;&lt;br /&gt;Большую часть времени на работе я занимаюсь поддержкой и активным развитием биллинговой подсистемы одной большой системы которая занимается записью компакт дисков. Название компании опускаю, так как я подписывал договор о неразглашении нечитая, посему не знаю что можно разглашать, а что нет :).&lt;br /&gt;&lt;br /&gt;Учитывая специфику проекта и интеграцию всего со всем я трижды сталкивался с задачей импорта данных из HTML документов в биллинговую систему.&lt;br /&gt;&lt;br /&gt;Три раза я использовал один и тот же подход - Regular Expression. &lt;br /&gt;Причем один из документов имел такую нетривиальную структуру, что мне пришлось использовать аж два регулярных выражения. В один проход я выделял все данные вместе с частью HTML разметки, а во второй уже выкусывал сами данные. Мне пришлось так поступить, потому как я уважаю мэйнтейнеров и не хочу писать код, после которого меня будут долго вспоминать.&lt;br /&gt;&lt;br /&gt;Кроме того, мне даже приходилось пережить один эпизод обновления разметки документа и обновлять свое же регулярные выражения...&lt;br /&gt;&lt;br /&gt;Не могу пожаловаться на плохие знания языка регулярных выражений, но этот процесс доставлял мало удовольствия, был очень и очень медленным. Но самое главное - если код парсера хоть и был легко читаем и сопровождаем, то сами регулярные выражения были настоящей занозой в заднице.&lt;br /&gt;&lt;br /&gt;Возможно Валера подумал что я полоумный, но тем не менее вежливо поделился своей идеей - использовать HTML Tidy для нормализации HTML до well formed XHTML, а потом наворачивать на это дело Xslt-преобразование которое извлекает все данные.&lt;br /&gt;&lt;br /&gt;Идея мне сразу же понравилась. Но меня смутило то, что мне придется вызывать unmanaged HTML Tidy, плюс я практически незнаком с Xslt хотя и знаю XPath.&lt;br /&gt;&lt;br /&gt;И вот, сегодня, совершенно случайно наткнулся на замечательное во всех отношениях решение - SGMLReader:&lt;br /&gt;&lt;a href="http://developer.mindtouch.com/Community/SgmlReader"&gt;SGMLReader - Converting almost any HTML to valid XML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SGMLReader это pure C# .NET 2.0 библиотека, центральный класс которой это SgmlReader унаследованный от XmlReader со всем вытекающими отсюда преимуществами.&lt;br /&gt;&lt;br /&gt;Есть даже примеры, которые запускаются на лету на живом коде из trunk:&lt;br /&gt;&lt;a href="http://developer.mindtouch.com/SgmlReader/HTML-to-XML_Conversion_Examples"&gt;HTML-to-XML Conversion Examples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Благодаря это библиотеке мне не придется погружаться в жестокий unmanaged мир и я смогу использовать Linq to Xml / Xslt / XPath на выбор.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В нагрузку ссылка на статью в которой описывается интеграция HTML Tidy и .NET. Если в двух словах то это либо P/Invoke либо COM Iterop. Брр...&lt;br /&gt;&lt;a href="http://www.devx.com/dotnet/Article/20505/1954?pf=true"&gt;Fix Up Your HTML with HTML Tidy and .NET&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ну и раз уж я удосужился написать пост, то упомяну что я завел себе твиттер :)&lt;br /&gt;&lt;a href="http://twitter.com/alexey_diyan"&gt;http://twitter.com/alexey_diyan&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В твиттер я делаю посты очень часто. Всех интересующихся заверяю, что посты в твиттер буду делать только на техническую тематику.&lt;br /&gt;Посты обычно касаются либо каких-то актуальных для меня вещей, изредка бывают 140-символьные размышлизмы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-993479857635130450?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/993479857635130450/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=993479857635130450' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/993479857635130450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/993479857635130450'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2010/01/html.html' title='Парсинг Html документов с целью извлечения данных'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-832932051322313463</id><published>2009-11-22T13:59:00.001-08:00</published><updated>2009-11-23T18:09:36.287-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>NHibernate. Fluent NHibernate. Первые впечатления</title><content type='html'>Не так давно я слушал доклад на тему ADO.NET Entity Framework 4.0, который читал на собрании Uneta Александр Кондуфоров. До недавнего времени мой опыт использования Entity Framework (1.0) можно было смело назвать более чем скромным. Вдохновленный услышанным докладом, я решил все таки заполнить пробелы своих знаний в области ORM.&lt;br /&gt;&lt;br /&gt;Причем решил пойти по не самому простому пути. Вначале я решил как можно ближе ознакомится с более зрелой ORM, которая широко признана в ALT.NET сообществе - NHibernate.&lt;br /&gt;&lt;br /&gt;В своем багаже знаний хочется иметь понимание того как строится уровень доступа к данным в наших приложениях при использовании как минимум двух ORM - NHibernate и Entity Framework. Это позволит, в случае необходимости, более взвешенно принимать решение в пользу того или иного ORM. Более того, каждый из этих ORM предполагает несколько вариантов их использования.&lt;br /&gt;&lt;br /&gt;Например у Entity Framework 4.0 существуют как минимум три подхода: Database first, Model first, Code only. Причем можно использовать либо не использовать POCO объекты.&lt;br /&gt;&lt;br /&gt;Довольно много информации, включая ссылки, можно почерпнуть из поста Саши &lt;a href="http://merle-amber.blogspot.com/2009/08/entity-framework-40.html"&gt;Entity Framework 4.0: выходим на зрелый уровень&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В различных блогах я довольно часто встречал мнение о том, что порог вхождения в NHibernate выше чем в Entity Framework. Так же довольно часто противопоставляют Anemic Data Model у Entity Framework и Rich Data Model у NHibernate. Например в посте Ivan'а &lt;a href="http://blogs.gotdotnet.ru/personal/bezzus/PermaLink.aspx?guid=7a6a69bd-bedf-425f-b09c-123b4a41f686"&gt;Старые песни о главном: роль ООП при работе с данными...&lt;/a&gt; количество комментариев перевалило за 90. :)&lt;br /&gt;&lt;br /&gt;Что же я хотел получить от NHibernate? Вот список важных для меня моментов:&lt;ul&gt;&lt;li&gt;полная изоляция от базы данных во всех юнит-тестах. В первую очередь рассматривал mockинг &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html"&gt;DAO&lt;/a&gt;/&lt;a href="http://martinfowler.com/eaaCatalog/repository.html"&gt;Repository&lt;/a&gt;. Еще витали мысли об использовании предварительно подготовленной SQLite базы, но я отказался от этой идеи; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;покрытие тестами уровня доступа к данным. Возможность написания интеграционных тестов на живую БД, которые покрывают все DAO/Repository; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;хотел получить &lt;a href="http://dddstepbystep.com/wikis/ddd/persistence-ignorance.aspx"&gt;Persistance&lt;/a&gt; &lt;a href="http://weblogs.asp.net/pgielens/archive/2005/07/29/420995.aspx"&gt;Ignorance&lt;/a&gt; как можно меньшей кровью; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;иметь возможность использовать Linq для написания запросов, а так же какой-нибудь API для вызова хранимых процедур. &lt;/li&gt;&lt;/ul&gt;В качестве полигона для своих проб я выбрал SQLite, т.к. меня интересовал в первую очередь ORM, к тому же я не хотел устанавливать на свой домашний ноутбук никаких полновесных СУБД.&lt;br /&gt;&lt;br /&gt;В начале я пробовал описать конфигурацию NHibernate в Application configuration file, потом описывал конфигурацию императивно в коде и в конечном счете остановился императивной конфигурации в коде с помощью библиотеки &lt;a href="http://fluentnhibernate.org/"&gt;Fluent NHibernate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Конфигурация выглядит достаточно просто и очень легко читается:&lt;pre class="prettyprint lang-cs"&gt;var session = Fluently.Configure()&lt;br /&gt;    .Database(SQLiteConfiguration.Standard&lt;br /&gt;    .ShowSql()&lt;br /&gt;    .UsingFile(@"D:\projects\DotNET\NHibernatePlayground\DB\northwindEF.db"))&lt;br /&gt;    .Mappings(m =&gt; m.FluentMappings.AddFromAssemblyOf&lt;Customer&gt;())&lt;br /&gt;    .BuildSessionFactory()&lt;br /&gt;    .OpenSession();&lt;/pre&gt;&lt;br /&gt;Так же, по мере изучения configuraion API у NHibernate, я обнаружил возможность трассировки всех SQL-запросов в лог с помощью конфигурирования трассировщика в log4net. Пока это не опробовал, но планирую это сделать. Это довольно удобно для отладки и этого очень сильно не хватало при работе с Entity Framework. Там была возможность написать свой механизм трассировки, но такого готового решения, как у NHibernate я у EF не обнаружил. Буду очень рад, если узнаю что EF это умеет и что я просто недостаточно хорошо искал.&lt;br /&gt;&lt;br /&gt;Далее я пришел к выводу, что у NHibernate-решения существует по крайней мере три подхода для работы с данными:&lt;ul&gt;&lt;li&gt;“канонический” подход, который пришел с Hibernate. Программист описывает объектную модель в виде набора POCO-объектов. Если со стороны БД у нас есть связи, то со стороны .NET у нас будут navigation-свойства с типизированными коллециями. Меппинг между .NET и БД описывается в специальных *.hbm.xml-файлах. Вполне возможно, этот подход можно было бы назвать удобным, если бы у него была мощная поддержка в Visual Studio в виде визуального дизайнера;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;проект &lt;a href="http://www.castleproject.org/activerecord/index.html"&gt;Castle ActiveRecord&lt;/a&gt;. Однако я эти проекты не рассматривал, т.к. ActiveRecord влияет на мою доменную модель. При его использовании мы должны помечать свои классы и свойства атрибутами, которые описывают меппинг к БД, а это нарушает Persistence Ignorance. В любом случае, этот подход вполне имеет право на жизнь в небольших проектах; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;описание меппинга с помощью Fluent NHibernate. Мне этот вариант понравился больше всего.&lt;/li&gt;&lt;/ul&gt;В Fluent NHibernate меппинг описывается на C# языке, что упрощает рефакторинг, предполагает наличие IntelliSense, а так же минимальную проверку грубых оплошностей в виде compile-time errors.&lt;br /&gt;&lt;br /&gt;Кроме того, у Fluent NHibernate есть две killer-фичи - это &lt;a href="http://wiki.fluentnhibernate.org/Auto_mapping"&gt;Auto Mapping&lt;/a&gt; + &lt;a href="http://wiki.fluentnhibernate.org/Auto_mapping#Conventions"&gt;Conventions&lt;/a&gt; и &lt;a href="http://wiki.fluentnhibernate.org/Persistence_specification_testing"&gt;Persistence specification testing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Auto Mapping я пока не использовал и пошел по пути “медленно но верно”. В качестве исходной БД я взял базу Northwind. По мере описания меппинга, я удивился насколько мощными возможностями обладает NHibernate. Например, NHibernate &lt;a href="http://samsonov.bn.by/lib/hibernate/inheritance.html"&gt;умеет круто меппить иерархии классов&lt;/a&gt; - table per class hierarchy, table per subclass, table per concrete class. Не знаю, насколько Fluent NHibernate покрывает возможности, заложенные в hbm.xml-меппинге, но он помог мне описать все нужные мне правила, не смотря на то, что я ни в коем случае не пытался прогнуть доменную модель под схему базы. Весь API по меппингу у Fluent NHibernate можно посмотреть по &lt;a href="http://wiki.fluentnhibernate.org/Fluent_mapping"&gt;этой ссылке&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Вот например как у меня выглядит класс Customer:&lt;pre class="prettyprint lang-cs"&gt;public class Customer&lt;br /&gt;{&lt;br /&gt;    public virtual string ID { get; set; }&lt;br /&gt;    public virtual string CompanyName { get; set; }&lt;br /&gt;    public virtual string ContactName { get; set; }&lt;br /&gt;    public virtual string ContactTitle { get; set; }&lt;br /&gt;    public virtual string Address { get; set; }&lt;br /&gt;    public virtual string City { get; set; }&lt;br /&gt;    public virtual string Region { get; set; }&lt;br /&gt;    public virtual string PostalCode { get; set; }&lt;br /&gt;    public virtual string Country { get; set; }&lt;br /&gt;    public virtual string Phone { get; set; }&lt;br /&gt;    public virtual string Fax { get; set; }&lt;br /&gt;    public virtual IList&lt;Order&gt; Orders { get; private set; } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Соответственно, меппинг этого класса выглядит вот так:&lt;pre class="prettyprint lang-cs"&gt;public class CustomerMap : ClassMap&lt;Customer&gt;&lt;br /&gt;{&lt;br /&gt;    public CustomerMap()&lt;br /&gt;    {&lt;br /&gt;        Table("Customers");&lt;br /&gt;        Id(x =&gt; x.ID).Column("CustomerID").Length(5);&lt;br /&gt;        Map(x =&gt; x.CompanyName).Length(40).Not.Nullable();&lt;br /&gt;        Map(x =&gt; x.ContactName).Length(30);&lt;br /&gt;        Map(x =&gt; x.ContactTitle).Length(30);&lt;br /&gt;        Map(x =&gt; x.Address).Length(60);&lt;br /&gt;        Map(x =&gt; x.City).Length(15);&lt;br /&gt;        Map(x =&gt; x.Region).Length(15);&lt;br /&gt;        Map(x =&gt; x.PostalCode).Length(10);&lt;br /&gt;        Map(x =&gt; x.Country).Length(15);&lt;br /&gt;        Map(x =&gt; x.Phone).Length(24);&lt;br /&gt;        Map(x =&gt; x.Fax).Length(24);&lt;br /&gt;        HasMany(x =&gt; x.Orders).KeyColumn("CustomerID");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Учитывая, что меппинг описывается вручную, то для того чтобы быть 100% уверенным в его корректности, необходимы тесты. Команда Fluent NHibernate подумала и над этой проблемой и предложила решение в виде &lt;a href="http://wiki.fluentnhibernate.org/Persistence_specification_testing"&gt;Persistence specification testing&lt;/a&gt;, который моем случае выглядит следующим образом:&lt;pre class="prettyprint lang-cs"&gt;[TestMethod]&lt;br /&gt;public void Save_Customer_in_database()&lt;br /&gt;{&lt;br /&gt;    RemoveCustomerIfExists("A");&lt;br /&gt;    new PersistenceSpecification&lt;Customer&gt;(TestHelper.GetSession())&lt;br /&gt;        .CheckProperty(c =&gt; c.ID, "A")&lt;br /&gt;        .CheckProperty(c =&gt; c.CompanyName, "TestCompanyName")&lt;br /&gt;        .CheckProperty(c =&gt; c.ContactName, "TestContactName")&lt;br /&gt;        .CheckProperty(c =&gt; c.ContactTitle, "TestContactTitle")&lt;br /&gt;        .CheckProperty(c =&gt; c.Address, "TestAddress")&lt;br /&gt;        .CheckProperty(c =&gt; c.City, "TestCity")&lt;br /&gt;        .CheckProperty(c =&gt; c.Region, "TestRegion")&lt;br /&gt;        .CheckProperty(c =&gt; c.PostalCode, "TestPostalCode")&lt;br /&gt;        .CheckProperty(c =&gt; c.Country, "TestCountry")&lt;br /&gt;        .CheckProperty(c =&gt; c.Phone, "TestPhone")&lt;br /&gt;        .CheckProperty(c =&gt; c.Fax, "TestFax")&lt;br /&gt;        .VerifyTheMappings();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Этот тест делает следующее:&lt;ul&gt;&lt;li&gt;приводит БД в предсостояние для теста (удаляет кастомера, если он уже существует); &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;создает экземпляр Customer с заданными параметрами; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;вставляет данные по этому кастомеру в базу данных; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;извлекает из базы данных запись в другой экземпляр класса Customer; &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;проверяет что полученный Customer соответствует оригинальному.&lt;/li&gt;&lt;/ul&gt;Еще стоило бы немного рассказать о HQL, Criteria API, NHibernate.Linq, Query Batcher и о случае “вау! какой же умный этот NHibernate”, но это не сейчас.&lt;br /&gt;&lt;br /&gt;На этом пожалуй хватит для одного поста. Буду очень благодарен за любой feedback, как положительный так и отрицательный.&lt;br /&gt;&lt;br /&gt;[UPDATE]&lt;br /&gt;Поменял тему в блоге на более нейтральную. Подключил google-code-prettify для подсветки синтаксиса. Надеюсь теперь будет удобне читать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-832932051322313463?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/832932051322313463/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=832932051322313463' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/832932051322313463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/832932051322313463'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/11/nhibernate-fluent-nhibernate.html' title='NHibernate. Fluent NHibernate. Первые впечатления'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8971085222056922059</id><published>2009-10-19T11:40:00.000-07:00</published><updated>2009-10-19T11:43:28.450-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Библиотека для объектно-объектного маппинга</title><content type='html'>&lt;div&gt;&lt;span style="font-weight: bold;"&gt;Вы подготовились к приходу AutoMapper?&lt;/span&gt;&lt;br /&gt;&lt;a href="http://blogs.gotdotnet.ru/personal/butaji/PermaLink.aspx?guid=9d2469ee-7c12-4551-8f15-6acdc155f5c6"&gt;http://blogs.gotdotnet.ru/personal/butaji/PermaLink.aspx?guid=9d2469ee-7c12-4551-8f15-6acdc155f5c6&lt;/a&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Прикольная штучка. Позволяет избегать тупых методов проекций DataEntity to  DomainEntity, DomainEntity to ServiceEntity...&lt;br /&gt;Вроде как сама все  волшебно перекладывает. Естественно, вы скажете что побочный эффект - runtime  errors.&lt;br /&gt;&lt;br /&gt;Но там для раннего выявления таких проблем сделали какой-то  механизм самотестирования. Типа можно при старте приложения дернуть метод и он  конфигурацию протестирует.&lt;br /&gt;&lt;br /&gt;В общем сплошное волшебство... интересно  сколько мозговой маны потребует это волшебство при наложении заклинаний. :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8971085222056922059?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8971085222056922059/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8971085222056922059' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8971085222056922059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8971085222056922059'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/10/blog-post.html' title='Библиотека для объектно-объектного маппинга'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3189959168320075896</id><published>2009-07-10T08:35:00.000-07:00</published><updated>2009-07-10T08:38:50.642-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threading'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Parallel Extensions для .NET. Ссылки</title><content type='html'>Хочу предупредить, что ссылки достаточно старые. Уверен, что на данный момент есть масса свежего материала. Насколько я знаю, эту библиотеку включат в .NET 4.0.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Parallel Extensions для .net 3.5&lt;br /&gt;&lt;a href="http://habrahabr.ru/blogs/net/45732/"&gt;http://habrahabr.ru/blogs/net/45732/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На мой взгляд самая удачная статья для ознакомления с библиотекой Parallel Extensions. Описывается структура библиотеки и введение в Task Parallel Library.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Оптимизация управляемого кода для многоядерных компьютеров&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/ru-ru/magazine/cc163340.aspx"&gt;http://msdn.microsoft.com/ru-ru/magazine/cc163340.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Достаточно объемная статья. Интересен пример, в котором показывается три варианта реализации алгоритма: однопоточный, многопоточный с использованием стандартного API в .NET, многопоточный с использованием Parallel Extensions.&lt;br /&gt;Несколько полнее описан Task Parallel Library. Описываются задания (Task) и диспетчер заданий (TaskManager), правда с момента написания статьи произошли небольшие изменения в API.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Блог команды, которая занимается разработкой Parallel Extensions&lt;br /&gt;&lt;a href="http://blogs.msdn.com/pfxteam/default.aspx"&gt;http://blogs.msdn.com/pfxteam/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В блоге доступна обширная информация по API библиотеки и описаны типовые сценарии.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Multiple thread-local state elements in a loop&lt;br /&gt;&lt;a href="http://blogs.msdn.com/pfxteam/archive/2008/05/28/8556655.aspx"&gt;http://blogs.msdn.com/pfxteam/archive/2008/05/28/8556655.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Описывается работа с типом ParallelState&lt;tlocal&gt; - контейнер для объектов которые "зашарены" на поток. В принципе API относительно удобный. Я использовал этот класс на проекте, но потом от него отказался. Перешел на кеширование объектов на уровне потока, которое предоставляет IoC контейнер (в моем случае это Castle.Windsor). Объекты запрашиваются у ServiceLocator'а, который я реализовал как фасад к Castle.Windsor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Coordination Data Structures Overview&lt;br /&gt;&lt;a href="http://blogs.msdn.com/pfxteam/archive/2008/06/18/8620615.aspx"&gt;http://blogs.msdn.com/pfxteam/archive/2008/06/18/8620615.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Coordination Data Structures – LazyInit&lt;t&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/pedram/archive/2008/06/02/coordination-data-structures-lazyinit-t.aspx"&gt;http://blogs.msdn.com/pedram/archive/2008/06/02/coordination-data-structures-lazyinit-t.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;По двум ссылкам выше, описываются структуры, которые можно использовать в многопоточных сценариях. Как правило эти структуры достаточно слабо описывают в статьях, которые посвящены библиотеке Parallel Extensions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Waltzing Through the Parallel Extensions June CTP: Synchronization Primitives&lt;br /&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/sasha/archive/2008/06/11/waltzing-through-the-parallel-extensions-june-ctp-synchronization-primitives.aspx"&gt;http://blogs.microsoft.co.il/blogs/sasha/archive/2008/06/11/waltzing-through-the-parallel-extensions-june-ctp-synchronization-primitives.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Есть элементы синхронизации в .NET, а есть и в Parallel Extensions. :)&lt;br /&gt;Да, я знаю что это такое и зачем это нужно, но мне лень это описывать :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;TaskManager – The Range Rover of the .Net 4 Parallel Extensions&lt;br /&gt;&lt;a href="http://www.lovethedot.net/2009/03/taskmanager-range-rover-of-net-4.html"&gt;http://www.lovethedot.net/2009/03/taskmanager-range-rover-of-net-4.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Очень хорошо описывается интерфейс класса TaskManager. Этот класс нужно использовать, если вам необходимо явно указать сколько процессоров/потоков вы готовы отдать планировщику. По-умолчанию планировщик использует все доступные ресурсы CPU.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3189959168320075896?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3189959168320075896/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3189959168320075896' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3189959168320075896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3189959168320075896'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/07/parallel-extensions-net.html' title='Parallel Extensions для .NET. Ссылки'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-2585782978382945414</id><published>2009-06-03T03:07:00.000-07:00</published><updated>2009-06-03T03:08:20.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ЯП'/><title type='text'>Сравнение 72 реализаций языков программирования</title><content type='html'>Сравнение 72 реализаций языков программирования:&lt;br /&gt;&lt;a href="http://www.opennet.ru/opennews/art.shtml?num=21974"&gt;http://www.opennet.ru/opennews/art.shtml?num=21974&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Прямая ссылка на картинку с визуальным отчетом:&lt;br /&gt;&lt;a href="http://gmarceau.qc.ca/blog/uploaded_images/size-vs-speed-vs-depandability.png"&gt;http://gmarceau.qc.ca/blog/uploaded_images/size-vs-speed-vs-depandability.png&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Легенда к визуальному отчету из которой видно что нижний левый угол это идеальные языки программирования:&lt;br /&gt;&lt;a href="http://gmarceau.qc.ca/blog/uploaded_images/size-vs-speed-vs-depandability--context-3.png"&gt;http://gmarceau.qc.ca/blog/uploaded_images/size-vs-speed-vs-depandability--context-3.png&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Субъективные выводы по визульному отчету:&lt;br /&gt;- Java существенно медленнее и несколько менее удобный язык чем C#&lt;br /&gt;- Perl по скорости быстрее чем Python, а Python практически такой же по скорости как и PHP&lt;br /&gt;- OCaml и luajit выглядят как идеальные языки. Я только не пойму luajit это Lua + Jit Compiler или как? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-2585782978382945414?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/2585782978382945414/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=2585782978382945414' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/2585782978382945414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/2585782978382945414'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/06/72.html' title='Сравнение 72 реализаций языков программирования'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-5927619203828511234</id><published>2009-04-25T08:54:00.000-07:00</published><updated>2009-04-25T09:05:47.363-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Каким должен быть правильный BL и DAL?</title><content type='html'>Не так давно нашел на ряд постов, которые сформировали у меня определенное видение решения классической задачки по передачи данных через ряд уровней - Data access layer -&gt; Business layer -&gt; Presentation layer.&lt;br /&gt;&lt;br /&gt;Первым был пост &lt;a href="http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx"&gt;Repository is the new Singleton&lt;/a&gt; от Oren Eini aka Ayende Rahien.&lt;br /&gt;&lt;br /&gt;В этом посте Ayende говорит что ему не очень нравится непосредственно сам паттерн Repository, более того от отмечает что в большистве случаев этот паттерн еще и не совсем правильно используют.&lt;br /&gt;&lt;br /&gt;Дествительно, с появлением LINQ и NHibernate/LinqToSql/ADO.NET Entity Framework подход к получению данных довольно сильно изменился.&lt;br /&gt;&lt;br /&gt;И я придерживаюсь того мнения что нужно постепенно уходить от практики написания огромного количества методов вида GetCustomer(id), GetCustomerWithAddresses(id) и начинать использовать механизм запросов даже на верхних уровнях.&lt;br /&gt;&lt;br /&gt;Если этого не делать, то мы очень быстро прийдем к достаточно некрасивому Data access layer'у - &lt;a href="http://ayende.com/Blog/archive/2009/04/17/kobe-ndash-data-access-done-wrong.aspx"&gt;Kobe – Data Access done wrong&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В своем следующем посте - "&lt;a href="http://ayende.com/Blog/archive/2009/04/18/the-dal-should-go-all-the-way-to-ui.aspx"&gt;The DAL should go all the way to UI&lt;/a&gt;" Ayende развивает идею и очень наглядно показывает какую цену приходится платить за неудачную реализацию Data access layer'а.&lt;br /&gt;&lt;br /&gt;Действительно, если делать sorting и paging по-честному, через Business Layer, то приходится вручную писать кучу методов, которые похожи друг на друга как близнецы браться, что как раз нарушает принцип DRY (Don't Repeat Yourself).&lt;br /&gt;&lt;br /&gt;Подход Ayende мне показался очень уместным, однако меня смутило отсутствие ограничений по извлечению даных на UI-уровне. Возможно, я параноик, но я бы хотел все вызовы по извлечению данных прокидывать через Business Layer. Как минимум это даст возможность прикрутить Caching/Logging/Security на query-методы.&lt;br /&gt;&lt;br /&gt;В ответ на пост Ayende, другой блоггер Justin Etheredge сделал &lt;a href="http://www.codethinked.com/post/2009/04/18/Keep-Your-IQueryable-In-Check.aspx"&gt;пост&lt;/a&gt; в котором привел достаточно удачную на мой взгляд реализацию paging'а и сортировки.&lt;br /&gt;&lt;br /&gt;В результате, однозначно для себя я решил несколько моментов:&lt;br /&gt;- Классы IRepository должны быть максимально небольшими и простыми&lt;br /&gt;- При получении данных необходимо иметь возможность строить цепочку из filtering, paging, sorting, поскольку это дает намного больше гибкости&lt;br /&gt;- Presentation Layer не должен работать с чрезмерно богатым интерфейсом, этот уровень должен использовать только то, что предоставляет ему Business Layer&lt;br /&gt;- Все большие либо нетривиальные запросы стоит инкапсулировать в отдельные Query-объекты&lt;br /&gt;&lt;br /&gt;Интересно, насколько удобно будет использовать это решение когда у нас пользовательский интерфейс написан на Silverlight? Ведь в таких случаях мы Business Layer не видим напрямую в своем Silverlight-приложении, а работаем с удаленными WCF-сервисами.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-5927619203828511234?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/5927619203828511234/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=5927619203828511234' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5927619203828511234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5927619203828511234'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/04/bl-dal.html' title='Каким должен быть правильный BL и DAL?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4265844188858598597</id><published>2009-04-14T03:12:00.000-07:00</published><updated>2009-11-25T16:12:20.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>SQLite для .NET разработчика. Ссылки.</title><content type='html'>Краткое описание на Wikipedia:&lt;br /&gt;&lt;a href="http://ru.wikipedia.org/wiki/SQLite"&gt;http://ru.wikipedia.org/wiki/SQLite&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Обычная энциклопедическая статья, которая в общих чертах описывает функциональность этой встроенной СУБД. Очень радует лицензия продукта, которая Public Domain.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Официальный сайт SQLite&lt;br /&gt;&lt;a href="http://www.sqlite.org/"&gt;http://www.sqlite.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;.NET программисту особенно тут делать нечего. Однако стоит прочитать две статьи в разделе Documentation - "Appropriate Uses For SQLite" и "Distinctive Features" чтобы иметь четкое понимание того, как именно позиционируется данный продукт.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQLite Management Tools&lt;br /&gt;&lt;a href="http://www.sqlite.org/cvstrac/wiki?p=ManagementTools"&gt;http://www.sqlite.org/cvstrac/wiki?p=ManagementTools&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Утилиты, которые позволяют управлять и выполнять запросы к базе SQLite&lt;br /&gt;&lt;br /&gt;SQLite Converter Tools&lt;br /&gt;&lt;a href="http://www.sqlite.org/cvstrac/wiki?p=ConverterTools"&gt;http://www.sqlite.org/cvstrac/wiki?p=ConverterTools&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Утилиты для конвертирования форматов других баз данных в формат SQLite и, наоборот.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQLite Wrappers&lt;br /&gt;&lt;a href="http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers"&gt;http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Библиотеки, которые позволяют обращаться к базе SQLite из различных языков программирования.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;System.Data.SQLite&lt;br /&gt;&lt;a href="http://sqlite.phxsoftware.com/"&gt;http://sqlite.phxsoftware.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Наиболее развитый на мой взглять ADO.NET Data Provider для SQLite.&lt;br /&gt;&lt;br /&gt;На официальном сайте можно отметить следующие интересные возможности этого проекта:&lt;br /&gt;- Полная поддержка стека ADO.NET 2.0&lt;br /&gt;- Поддержка .NET, .NET Compact Framework, Mono&lt;br /&gt;- Поддержка ADO.NET Entity Framework, который доступен в .NET 3.5&lt;br /&gt;- Design-Time поддержка в Visual Studio 2008&lt;br /&gt;- Есть возможность шифрования базы данных&lt;br /&gt;&lt;br /&gt;Для того чтобы распространять .NET проект, в котором используется база данных SQLite достаточно включить в него сборку System.Data.SQLite.dll, которая сама уже содержит оригинальную библиотеку.&lt;br /&gt;Кроме того, можно использовать альтернативный вариант распространения - включать в дистрибутив приложения сборку System.Data.SQLite.dll из каталога ManagedOnly + оригинальную sqlite3.dll.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[UPDATE 2009-11-26]&lt;br /&gt;&lt;br /&gt;Пост вызвыл активную реакцию, чему я безмерно рад. Большое спасибо за фидбек, я получил целый ряд полезных "зацепок", которые в последствии могут пригодится.&lt;br /&gt;&lt;br /&gt;Насчет ссылочной целостности в SQLite. Действительно, неделю назад обнаружил в документации что по-умолчанию в SQLite не включены FK Constraints. Да, не фонтан. Пусть даже это и встроенная СУБД, но я бы не отказался от такого полезного механизма контроля.&lt;br /&gt;&lt;br /&gt;По ссылке ниже описывается как можно проверить включены ли они или нет и что нужно сделать чтобы их таки включить:&lt;br /&gt;&lt;a href="http://www.sqlite.org/foreignkeys.html"&gt;http://www.sqlite.org/foreignkeys.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Из документации видно, что в будущих релизах FK Constraints могут быть включены.&lt;br /&gt;&lt;br /&gt;Плюс еще довольно полезная информация по поводу того, чего SQLite не умеет из SQL92 стандарта:&lt;br /&gt;&lt;a href="http://www.sqlite.org/omitted.html"&gt;http://www.sqlite.org/omitted.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Пока для себя расставил такие приоритеты: &lt;br /&gt;- если размер дистрибутива важен, и можно принебречь остутствием ряда продвинутых фич, то я предпочту SQLite;&lt;br /&gt;- требовать уж очень высокой скорости работы от встроенной СУБД думаю что не стоит;&lt;br /&gt;- Embedded Firebird выгодно отличается от SQLite возможностью с нее "соскочить" на полновесную Firebird. Предполагаю что это будет максимально безполезненно;&lt;br /&gt;- Еще подумываю об необходимости использовании ORM + встроенная БД. Тогда и поставщиков БД можно будет менять как перчатки. Ну или почти...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4265844188858598597?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4265844188858598597/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4265844188858598597' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4265844188858598597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4265844188858598597'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/04/sqlite-net.html' title='SQLite для .NET разработчика. Ссылки.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-2454536254003944654</id><published>2009-03-18T09:30:00.000-07:00</published><updated>2009-03-18T09:32:38.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><category scheme='http://www.blogger.com/atom/ns#' term='Образование'/><title type='text'>Доступ к DreamSpark по студенческому билету для украинских студентов и аспирантов</title><content type='html'>Если ты студент и у тебя есть студенческий билет, то ты можешь получить ряд продуктов бесплатно:&lt;br /&gt;Visual Studio 2008&lt;br /&gt;Visual Studio 2005&lt;br /&gt;XNA Game Studio 3&lt;br /&gt;SQL Server 2008 Developer&lt;br /&gt;Windows Server 2003&lt;br /&gt;Windows Server 2008 Standard&lt;br /&gt;Expression Studio 2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Подробности тут:&lt;br /&gt;&lt;a href="http://msug.vn.ua/blogs/akrakovetsky/archive/2009/01/31/dreamspark-available-in-ukraine.aspx"&gt;Доступ к DreamSpark по студенческому билету для украинских студентов и аспирантов&lt;/a&gt;&lt;a href="http://msug.vn.ua/blogs/akrakovetsky/archive/2009/01/31/dreamspark-available-in-ukraine.aspx"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-2454536254003944654?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/2454536254003944654/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=2454536254003944654' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/2454536254003944654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/2454536254003944654'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/03/dreamspark.html' title='Доступ к DreamSpark по студенческому билету для украинских студентов и аспирантов'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6260936815362351780</id><published>2009-03-16T03:40:00.000-07:00</published><updated>2009-03-16T04:04:28.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Необычный подход к написанию юнит тестов</title><content type='html'>Обнаружил довольно необычный подход к написанию юнит тестов у автора вот этого поста:&lt;br /&gt;&lt;a href="http://blogs.gotdotnet.ru/personal/ulu/PermaLink.aspx?guid=22f92562-287e-4220-a57a-239d1d0fae53"&gt;Test Driven Design и Test First Development -- в чем разница?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Меня привлекло то, что тест класс представляет из себя наследник тестируемого класса.&lt;br /&gt;&lt;br /&gt;Приведу пример классического и альтернативного подхода (&lt;a href="http://www.nunit.org/index.php?p=quickStart&amp;amp;r=2.4.8"&gt;пример&lt;/a&gt; из документации &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Тестируемый класс:&lt;br /&gt;&lt;pre&gt;namespace bank&lt;br /&gt;{&lt;br /&gt; public class Account&lt;br /&gt; {&lt;br /&gt;   private float balance;&lt;br /&gt;   public void Deposit(float amount)&lt;br /&gt;   {&lt;br /&gt;     balance+=amount;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void Withdraw(float amount)&lt;br /&gt;   {&lt;br /&gt;     balance-=amount;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void TransferFunds(Account destination, float amount)&lt;br /&gt;   {&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public float Balance&lt;br /&gt;   {&lt;br /&gt;     get{ return balance;}&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;Тест, написаный при помощи "классического" подхода:&lt;br /&gt;&lt;pre&gt;namespace bank&lt;br /&gt;{&lt;br /&gt; using NUnit.Framework;&lt;br /&gt;&lt;br /&gt; [TestFixture]&lt;br /&gt; public class AccountTest&lt;br /&gt; {&lt;br /&gt;   [Test]&lt;br /&gt;   public void TransferFunds()&lt;br /&gt;   {&lt;br /&gt;     Account source = new Account();&lt;br /&gt;     source.Deposit(200.00F);&lt;br /&gt;     Account destination = new Account();&lt;br /&gt;     destination.Deposit(150.00F);&lt;br /&gt;&lt;br /&gt;     source.TransferFunds(destination, 100.00F);&lt;br /&gt;     Assert.AreEqual(250.00F, destination.Balance);&lt;br /&gt;     Assert.AreEqual(100.00F, source.Balance);&lt;br /&gt; &lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;Тест, написанный с помощью альтернативного подхода с наследованием:&lt;br /&gt;&lt;pre&gt;namespace bank&lt;br /&gt;{&lt;br /&gt; using NUnit.Framework;&lt;br /&gt;&lt;br /&gt; [TestFixture]&lt;br /&gt; public class AccountTest : Account&lt;br /&gt; {&lt;br /&gt;   [Test]&lt;br /&gt;   public void TestTransferFunds()&lt;br /&gt;   {&lt;br /&gt;     this.Deposit(200.00F);&lt;br /&gt;     Account destination = new Account();&lt;br /&gt;     destination.Deposit(150.00F);&lt;br /&gt;&lt;br /&gt;     this.TransferFunds(destination, 100.00F);&lt;br /&gt;     Assert.AreEqual(250.00F, destination.Balance);&lt;br /&gt;     Assert.AreEqual(100.00F, this.Balance);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Сразу отмечу, что конкретно в этом примере второй вариант, вероятно, выглядит неудачно. Скорее всего в каких-то случаях наследование, возможно, выглядит более привлекательно.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Лично у меня возникает вопрос. А стоит ли вообще так писать тесты?&lt;br /&gt;&lt;br /&gt;У меня сходу возникли следующие мысли насчет альтернативного подхода:&lt;br /&gt;+ Наследование позволяет протестировать protected методы&lt;br /&gt;+ Я могу написать helper-методы в тест классе, который будет активно работать с protected методами и свойствами&lt;br /&gt;- Наследование дает бОльшую связность между тестовым и тестируемым классом&lt;br /&gt;- Наследование скорее всего завяжет мне руки в SetUp/TearDown методах&lt;br /&gt;- Если класс sealed, то о подходе с наследованием можно забыть&lt;br /&gt;- Когда я пишу классический тест-метод, то я получаю лаконичную документацию к своему коду в виде маленьких примеров&lt;br /&gt;- Когда я пишу классический тест-метод, то я использую класс точно так же как это делает production-код&lt;br /&gt;- У класса Account будет аж два клиента - production code and unit tests, что как правило будет положительно отражаться на его интерфейсе&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Очень интересны ваши мнения на этот счет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6260936815362351780?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6260936815362351780/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6260936815362351780' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6260936815362351780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6260936815362351780'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/03/blog-post_16.html' title='Необычный подход к написанию юнит тестов'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3117435902240275451</id><published>2009-03-11T13:19:00.000-07:00</published><updated>2009-03-11T13:26:17.403-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Тесты'/><title type='text'>Тест. Какой вы ученый?</title><content type='html'>Очередное баловство на тему тестов.&lt;br /&gt;&lt;br /&gt;Да, действительно, я всегда стараюсь копнуть глубоко в тех вещах, которыми занимаюсь, которые считаю важными для себя.&lt;br /&gt;&lt;br /&gt;Как правило это играет мне на руку, хотя иногда все-же делает меня занудой. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="0" align="center" style="width: 400px; border: 1px solid #EEEEEE;"&gt;&lt;tr&gt;&lt;td style="text-align: center; margin: 0px; padding: 8px; background-color: #006680; color: #FFFFFF; font: 16px Arial"&gt;О, да вы - физик.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; padding: 8px; background-color: #FFFFFF; color: #000000; font: 12px Arial"&gt;&lt;img src="http://img-fotki.yandex.ru/get/3/orgchem413.0/0_f85f_30e2344d_M.jpg" align="left" style="padding: 8px;" alt="image" /&gt; Вы дотошны и предпочитаете во всем докапываться до самой сути вещей. Перед покупкой сложной техники вы обязательно потратите кучу времени на сравнение всех возможных моделей пока не узнаете про них все. Порой вы иронично посмеиваетесь над серьезностью этого мира, но мало кто так же хорошо, как и вы, понимает, насколько хрупкая и сложная игрушка этот самый мир.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center; margin: 0px; padding: 8px; background-color: #006680; font: 12px Arial"&gt;&lt;a href="http://aeterna.ru/test.php?link=tests:42622" style="color: #FFFFFF"&gt;Пройти тест&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3117435902240275451?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3117435902240275451/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3117435902240275451' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3117435902240275451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3117435902240275451'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/03/blog-post.html' title='Тест. Какой вы ученый?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4292256531969999514</id><published>2009-02-19T05:14:00.000-08:00</published><updated>2009-02-19T05:16:21.666-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>IronPython. Ссылки.</title><content type='html'>Начинаем работать с IronPython.&lt;br /&gt;&lt;a href="http://blogs.gotdotnet.ru/personal/AlexanderByndyu/PermaLink.aspx?guid=71d5dcff-7833-4242-ac06-5388ad993acf"&gt;http://blogs.gotdotnet.ru/personal/AlexanderByndyu/PermaLink.aspx?guid=71d5dcff-7833-4242-ac06-5388ad993acf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Entry point для того чтобы начать работать с IronPython в Visual Studio 2008.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Блог автора языка IronPython:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/haibo_luo/default.aspx"&gt;http://blogs.msdn.com/haibo_luo/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IronPython: Grab the .NET Type&lt;br /&gt;&lt;a href="http://blogs.msdn.com/haibo_luo/archive/2007/09/25/5130087.aspx"&gt;http://blogs.msdn.com/haibo_luo/archive/2007/09/25/5130087.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Можно сказать entry point по IronPython/.NET interop. Очень мало, но наглядно :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IronPython: Keyword Argument to Set .NET Property/Field&lt;br /&gt;&lt;a href="http://blogs.msdn.com/haibo_luo/archive/2007/10/02/5246577.aspx"&gt;http://blogs.msdn.com/haibo_luo/archive/2007/10/02/5246577.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Если кто-нибудь любит свеженькие конструкции C# вроде Object Initializer, то стоит просмотреть этот пост.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IronPython: Passing Arguments for a Call&lt;br /&gt;&lt;a href="http://blogs.msdn.com/haibo_luo/archive/2007/10/01/5230964.aspx"&gt;http://blogs.msdn.com/haibo_luo/archive/2007/10/01/5230964.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Примеры использования разных способов передачи параметров в функцию - позиционные параметры, параметры со значением по-умолчанию, опциональные параметры, передача параметра по имени.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IronPython: Provide (or not) Argument for by-ref Parameter&lt;br /&gt;&lt;a href="http://blogs.msdn.com/haibo_luo/archive/2007/10/04/5284947.aspx"&gt;http://blogs.msdn.com/haibo_luo/archive/2007/10/04/5284947.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вызов методов с ref-параметрами.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IronPython Cookbook&lt;br /&gt;&lt;a href="http://www.ironpython.info/index.php/Main_Page"&gt;http://www.ironpython.info/index.php/Main_Page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Собрание материалов по IronPython.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SimplePrograms&lt;br /&gt;&lt;a href="http://wiki.python.org/moin/SimplePrograms"&gt;http://wiki.python.org/moin/SimplePrograms&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Своеобразные подсказки для тех, кто не хочет держать все время языковые конструкции в голове ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DLR Hosting and related stuff...&lt;br /&gt;&lt;a href="http://blogs.msdn.com/seshadripv/default.aspx"&gt;http://blogs.msdn.com/seshadripv/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Релизная версия IronPython 2.0 работает поверх Dynamic Language Runtime. Если вам (не дай бог :) ) придется интегрировать хостинг Python-скриптов с вашим .NET-приложением, то тут можно почерпнуть максимум возможной информации.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4292256531969999514?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4292256531969999514/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4292256531969999514' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4292256531969999514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4292256531969999514'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/02/ironpython.html' title='IronPython. Ссылки.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-7588451111585480606</id><published>2009-02-09T14:32:00.000-08:00</published><updated>2009-02-09T14:37:40.522-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Тесты'/><title type='text'>Тест. Какая культура вам ближе?</title><content type='html'>Решил расслабить мозги после тяжелого трудового понедельника очередным тестом :)&lt;br /&gt;&lt;br /&gt;&lt;table border="0" style="width: 400px; border: 1px solid #EEEEEE;"&gt;&lt;tr&gt;&lt;td style="text-align: center; margin: 0px; padding: 8px; background-color: #006680; color: #FFFFFF; font: 16px Arial"&gt;Поздравляем!!! Вам ближе американская культура&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: left; padding: 8px; background-color: #FFFFFF; color: #000000; font: 12px Arial"&gt;Вас зовет земля свободы! Вам импонируют американское видение жизни и ценности "нового света". &lt;img src="http://foto.rambler.ru/public/stormyday/1/5/1-web.jpg" align="right" alt="image" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align: center; margin: 0px; padding: 8px; background-color: #006680; font: 12px Arial"&gt;&lt;a href="http://aeterna.ru/test.php?link=tests:26861" style="color: #FFFFFF"&gt;Пройти тест&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-7588451111585480606?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/7588451111585480606/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=7588451111585480606' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7588451111585480606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7588451111585480606'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/02/blog-post.html' title='Тест. Какая культура вам ближе?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1729604640652367719</id><published>2009-01-30T03:52:00.000-08:00</published><updated>2009-01-30T03:58:11.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>KDE 4.2. Релиз для всех.</title><content type='html'>Выпущен релиз KDE 4.2, который, как утверждают разработчики, уже готов для конечного пользователя.&lt;br /&gt;&lt;br /&gt;До этого было два релиза, которые опционально включались в дистрибутивы, однако не были готовы к повседневному использованию простыми смертными.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Обзор. Можно ограничиться просмотром картинок :)&lt;br /&gt;&lt;a href="http://adymo.blogspot.com/2009/01/kde4-review-from-inside-out-part-1.html"&gt;http://adymo.blogspot.com/2009/01/kde4-review-from-inside-out-part-1.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://adymo.blogspot.com/2009/01/kde-42-review-from-inside-out-part-2.html"&gt;http://adymo.blogspot.com/2009/01/kde-42-review-from-inside-out-part-2.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я с большим интересом наблюдаю за развитием ветки 4.x. Было даже несколько попыток установить его на свой дистрибутив Ubunut. Однако каждый раз я возвращался на стабильный Gnome. Хотя во многих моментах KDE 4.x мне нравится больше чем Gnome.&lt;br /&gt;&lt;br /&gt;Отмечу так же что стабильный релиз KDE 3.5 мне вообще не нравился.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1729604640652367719?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1729604640652367719/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1729604640652367719' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1729604640652367719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1729604640652367719'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2009/01/kde-42.html' title='KDE 4.2. Релиз для всех.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-5214670793092953710</id><published>2008-12-20T05:17:00.000-08:00</published><updated>2008-12-20T05:34:31.623-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Образование'/><title type='text'>Знаю ли я русский язык?</title><content type='html'>Недавно наткнулся на нехитрый тест по проверке знаний русского языка.&lt;br /&gt;&lt;br /&gt;&lt;table style="background: rgb(255, 228, 147) none repeat scroll 0% 50%; text-align: justify; width: 510px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-size: 11pt;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Я проверил свои знания русского языка и получил четверку.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.rb.ru/poll/7/img/4.gif" width="500" align="center" height="164" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.rb.ru/poll/7/"&gt;Сходи, проверься?&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Кроме информации выше, на странице был еще вот такое резюме по поводу моего результата:&lt;br /&gt;&lt;br /&gt;Вы ответили на &lt;b&gt;6 из 8 простых&lt;/b&gt; вопросов. Не самый плохой результат на общем фоне. Скорее всего, вы неплохо знали русский язык в школе, просто было это давно, и теперь учебник Розенталя для вас заменяет грамматическая автопроверка в "Ворде". Гордиться вам особенно нечем, но для выживания в среде носителей русского языка этого вполне хватит. Таких, как вы, в стране, согласно опросу ВЦИОМа, - &lt;b&gt;21%&lt;/b&gt;.*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Какие мои личные выводы?&lt;br /&gt;&lt;br /&gt;1. Мои учителя действительно были правы, когда ставили мне 4 на протяжении многих лет школы.&lt;br /&gt;2. Спустя много лет мой мозг еще не успел засохнуть :)&lt;br /&gt;3. Как гражданин Украины, который родился и вырос в этой стране, вполне могу себе позволить иметь оценку четыре по языку, который не является государственным.&lt;br /&gt;4. По украинскому языку у меня тоже было четыре. Но это связано с тем что я говорю и думаю на русском языке, а мое любимое, [censored], государство считает что я (и еще 1/2 - 1/3 граждан) должен знать государственный язык.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-5214670793092953710?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/5214670793092953710/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=5214670793092953710' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5214670793092953710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5214670793092953710'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/12/blog-post.html' title='Знаю ли я русский язык?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1817805414614981125</id><published>2008-11-09T08:12:00.000-08:00</published><updated>2008-11-09T08:29:03.215-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>XML в качестве DataSource для юнит тестов</title><content type='html'>Что-то в последнее время я вижу просто невообразимое обилие постов на тему TDD, что не может не радовать :)&lt;br /&gt;&lt;br /&gt;Регулярно читая посты одного моего уважаемого коллеги по имени &lt;a href="http://dev.net.ua/blogs/mikechaliy/"&gt;Mike Chaliy&lt;/a&gt; обнаружил заметку &lt;a id="bp___v___r___postlist___EntryItems_ctl01_PostTitle" href="http://dev.net.ua/blogs/mikechaliy/archive/2008/10/29/7095.aspx"&gt;CSV у якості DataSource&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Вначале хотел оставить комментарий, но потом решил сделать это в виде отдельного поста.&lt;br /&gt;&lt;br /&gt;Итак, Mike предпочитает CSV. Он достаточно подробно описал причины его решения, поэтому я решил немного пропиарить формат XML :)&lt;br /&gt;&lt;br /&gt;Естественно что для табличных данных XML дает достаточно неслабый overhead. Для того чтобы заполнить файл нужно потратить дополнительное время чтобы описать XML-структуру для новых данных вместо того, чтобы просто их перечислять.&lt;br /&gt;&lt;br /&gt;На мой взгляд, у CSV формата в качестве источника данных для юнит тестов так же есть несколько недостатков, которые я привожу ниже:&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;Изменение структур данных&lt;/span&gt;. Добавляется новое либо удаляется старое поле. Приходится менять CSV документ. Причем придется чуть-чуть поколдовать над загрузкой документа в тот же Excel для того чтобы представить его в табличном виде. После чего нужно отредактировать эту таблицу и опять сохранить в CSV.&lt;br /&gt;&lt;br /&gt;В случае с XML можно обойтись банальным Find/Replace в текстовом редакторе. Хотя это конечно дело вкуса. В любом случае нужно помнить об этом, поскольку для кого-то это может быть проблемой.&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;Обработка ошибок чтения&lt;/span&gt;. В .NET достаточно бедные средства для того чтобы работать с CSV форматом. С другой стороны, связка XML-файл + XSD-схема + класс-контейнер полученный от XSD.exe + чтение файла с валидацией по схеме выглядит очень привлекательно.&lt;br /&gt;&lt;br /&gt;Предположим другой разработчик, меняет функциональность подсистемы. Для этого он должен дополнить CSV-файл новыми данными. Он обновляет документ, и тут бац! Оказывается что он ошибся, поэтому документ не читается. Очень часто потребуется немного поднапрячь свой мозг чтобы понять что же там не так.&lt;br /&gt;&lt;br /&gt;Если бы он обновлял XML документ он бы получил довольно внятное объяснение почему документ не может быть загружен.&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Строгая типизация&lt;/span&gt;. Если использовать класс-контейнер, то сериализатор сам будет делать все приведения типов. В случае с CSV тебе придется этот код писать самому.&lt;br /&gt;&lt;br /&gt;В качестве контр-аргумента можно сказать что разработчику все равно придется перекладывать данные из Xml-класса в класс, который нужен юнит тесту.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Таким образом, для меня выбор между CSV и XML практически эквивалентен с очень небольшим перевесом в пользу XML ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1817805414614981125?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1817805414614981125/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1817805414614981125' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1817805414614981125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1817805414614981125'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/11/xml-datasource.html' title='XML в качестве DataSource для юнит тестов'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6452812766209433322</id><published>2008-09-26T02:07:00.000-07:00</published><updated>2008-09-27T10:08:58.625-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding guidelines'/><title type='text'>Начинающим на заметку. Два поста об оформлении исходного кода.</title><content type='html'>Фигурные скобки и их влияние на качество кода:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.gotdotnet.ru/personal/ezakhareyev/CommentView.aspx?guid=77a8ef9b-19cb-401a-b832-ffac0ad7b3ad"&gt;http://blogs.gotdotnet.ru/personal/ezakhareyev/CommentView.aspx?guid=77a8ef9b-19cb-401a-b832-ffac0ad7b3ad&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В статье автор дает достаточно логичное обоснование почему фигурные скобки нужно расставлять именно так, как он предлагает :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Точки выхода или немного о структурном программировании:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.gotdotnet.ru/personal/XaocCPS/PermaLink.aspx?guid=72b2322a-6782-4ee6-b4e9-66df9678b56a"&gt;http://blogs.gotdotnet.ru/personal/XaocCPS/PermaLink.aspx?guid=72b2322a-6782-4ee6-b4e9-66df9678b56a&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Так же обоснование одного из правил по оформлению методов и функций. Я разделяю точку зрения автора с одним лишь исключением: если метод очень простой И содержит 5-ть и менее строк, то я все-же использую несколько точек выхода.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;:&lt;br /&gt;Поправил вторую ссылку в которой текст и целевой url не совпадали.&lt;br /&gt;&lt;br /&gt;Пожалуй отвечу на коментарии прямо в этот пост.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[mormat]&lt;/span&gt; Не знаю, почему в компании DevExpress другие гайдлайны (открывающая скобка на старой" строчке), неужели им удобно читать собственный код.. Сила привычки?&lt;br /&gt;&lt;br /&gt;Мне один мой коллега на работе сказал что Мартин Фаулер так же придерживается нотации, согласно которой открывающая фигурная скобка не переносится на новую строку. Так что насчет расположения фигурных скобок это скорее вопрос выбора. Я не берусь утверждать что переносить фигурную скобку на новую строку это серебряная пуля, но мне нравится именно эта нотация.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[mormat]&lt;/span&gt; Что касается множественных return-ов в теле метода, то помоему односторонняя совершенно статья. Где обоснование, где рассмотрение альтернативных точек зрения? Где плюсы, минусы? Я, например, знаю обратную точку зрения, что ряд валидирующих проверок в начале метода (с return-ами) сильно упрощает поддержку кода.&lt;br /&gt;&lt;br /&gt;Честно говоря тут я более категорично настроен :)  Если речь идет имено о валидации переданных данных, то тут стоит бросать исключения, а не использовать return. Хотя, уверен что ты имел ввиду скорее не валидацию параметров, а проверку на применимость метода.&lt;br /&gt;&lt;br /&gt;Как бы там ни было гораздо удобнее поставить точку останова на один-единственный return для того чтобы посмотреть возвращаемое значение.&lt;br /&gt;&lt;br /&gt;К тому же если у меня идет некотороая проверка данных и лишняя вложенность уложняет код, то это можно решить следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;DIV style="font-weight:normal;font-family:Consolas,Monaco,Courier New,Courier,monospace !important;font-size:12px;margin:0;padding:0;border:none;background-color:#E7E5DC;overflow:auto;padding-top:1px;"&gt;&lt;DIV style="padding-left:45px;" id="id_6618119232"&gt;&lt;DIV style="padding: 3px 8px 3px 10px;font-size:9px;background-color:#f8f8f8;border-left:3px solid #6CE26C;"&gt;&lt;A HREF="javascript:CopyToClipboard('id_6618119232')" STYLE="text-decoration:none;color:#a0a0a0;"&gt;copy to clipboard&lt;/A&gt;&lt;A style="float:right;color:#a0a0a0;margin-top:-12px;" HREF="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;OL style="list-style:decimal;list-style-position:outside;background-color:#fff;border-left:3px solid #6CE26C;margin: 0px 0px 1px 45px !important;padding:0px;color:#5C5C5C;line-height:14px;"&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;public&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;ResultType&amp;nbsp;DoSomething(SomeType&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;)&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="color:#008200;"&gt;//&amp;nbsp;Если&amp;nbsp;параметр&amp;nbsp;невалидный,&amp;nbsp;то&amp;nbsp;этот&amp;nbsp;метод&amp;nbsp;прокинет&amp;nbsp;исключение.&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ValidateSomeType(&lt;SPAN style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;);&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="color:#008200;"&gt;//&amp;nbsp;В&amp;nbsp;некоторых&amp;nbsp;случаях&amp;nbsp;бывает&amp;nbsp;удобно&amp;nbsp;инициализировать&amp;nbsp;объект&amp;nbsp;значением&amp;nbsp;по-умолчанию&amp;nbsp;сразу&amp;nbsp;с&amp;nbsp;его&amp;nbsp;объявлением.&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResultType&amp;nbsp;result;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="color:#008200;"&gt;//&amp;nbsp;Если&amp;nbsp;нам&amp;nbsp;не&amp;nbsp;нужно&amp;nbsp;выполнять&amp;nbsp;никаких&amp;nbsp;действий&amp;nbsp;над&amp;nbsp;объектом,&amp;nbsp;то&amp;nbsp;мы&amp;nbsp;просто&amp;nbsp;выйдем&amp;nbsp;из&amp;nbsp;метода.&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="color:#069;font-weight:bold;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;(IsAcceptable(&lt;/SPAN&gt;&lt;SPAN style="color:#069;font-weight:bold;"&gt;value&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;))&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#fff;color:inherit;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="color:#069;font-weight:bold;"&gt;return&lt;/SPAN&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;&amp;nbsp;result;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI style="background-color:#F8F8F8;color:#5C5C5C;padding:0 3px 0 10px;margin:0;"&gt;&lt;SPAN style="color:black;background-color:inherit;"&gt;}&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6452812766209433322?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6452812766209433322/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6452812766209433322' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6452812766209433322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6452812766209433322'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/09/blog-post.html' title='Начинающим на заметку. Два поста об оформлении исходного кода.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1195727686843699093</id><published>2008-08-15T10:04:00.000-07:00</published><updated>2008-11-09T08:29:53.282-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Миграция данных из одной таблицы в другую. Гибкое решение.</title><content type='html'>Буквально пару дней назад один мой знакомый, начинающий .NET программист показал мне код, который занимается переносом данных из одной базы в другую, причем паралельно делает преобразование типов:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: medium none ; margin: 0pt; padding: 1px 0pt 0pt; overflow: auto; font-weight: normal; font-family: Consolas,Monaco,Courier New,Courier,monospace ! important; font-size: 12px; background-color: rgb(231, 229, 220);"&gt;&lt;div style="padding-left: 45px;" id="id_6636405927"&gt;&lt;div style="border-left: 3px solid rgb(108, 226, 108); padding: 3px 8px 3px 10px; font-size: 9px; background-color: rgb(248, 248, 248);"&gt;&lt;a href="javascript:CopyToClipboard('id_6636405927')" style="text-decoration: none; color: rgb(160, 160, 160);"&gt;copy to clipboard&lt;/a&gt;&lt;a style="float: right; color: rgb(160, 160, 160); margin-top: -12px;" href="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol style="border-left: 3px solid rgb(108, 226, 108); margin: 0px 0px 1px 45px ! important; padding: 0px; list-style-type: decimal; list-style-image: none; list-style-position: outside; background-color: rgb(255, 255, 255); color: rgb(92, 92, 92); line-height: 14px;"&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; nsvid=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; nsit=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; type=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; nzav=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; ninv=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; lim=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; tochnost=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;where&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;System.DateTime dtp = System.DateTime.Today;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;Int64 pov=0;  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;System.DateTime dtn = System.DateTime.Today;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; texsos=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;for&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (Int64 i = 0; i &lt;&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Is___п_пNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;       pp = &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;long&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].___п_п.ToString());  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Is___свид_Null())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;       nsvid = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].___свид_;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsНаименование_СИТNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        nsit = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Наименование_СИТ;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsТипNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        type = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Тип;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Is_Заводской__Null())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        nzav = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())]._Заводской__;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Is_Инвентарный___Null())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        ninv = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())]._Инвентарный___;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsПредел_измеренийNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        lim = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Предел_измерений;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Is_Класс__разряд__ц_д___погрешностьNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        tochnost = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())]._Класс__разряд__ц_д___погрешность;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsВладелецNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;where&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; = bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Владелец;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsДата_поверкиNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        dtp = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Дата_поверки;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsПериодичность_поверкиNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        pov = &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;long&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Периодичность_поверки.ToString());  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].IsДата_следующей_поверкиNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        dtn = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Дата_следующей_поверки;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (!bdt[&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())].Is_Тех_состояниеNull())  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        texsos = bdt[&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(i.ToString())]._Тех_состояние;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    pdt.AddPriborRow(i+1, nsvid, nsit, type, nzav, ninv, lim, tochnost, &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;where&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;, dtp, pov, dtn, tochnost);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;     &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;}  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;priborTableAdapter.Update(pdt);  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;pdt.AcceptChanges();  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Достаточно беглого взгляда на этот код чтобы понять - реализация метода неоптимальна.&lt;br /&gt;&lt;br /&gt;Мы наблюдаем большое количество операторов ветвления, что является признаком плохого тона и должно наталкивать на размышления об улучшении этого кода.&lt;br /&gt;&lt;br /&gt;Поэтому, для иллюстрации я на коленке набросал более лаконичный подход, который можно повторно использовать.&lt;br /&gt;&lt;br /&gt;1. Делаем универсальный конвертер данных:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: medium none ; margin: 0pt; padding: 1px 0pt 0pt; overflow: auto; font-weight: normal; font-family: Consolas,Monaco,Courier New,Courier,monospace ! important; font-size: 12px; background-color: rgb(231, 229, 220);"&gt;&lt;div style="padding-left: 45px;" id="id_5562018867"&gt;&lt;div style="border-left: 3px solid rgb(108, 226, 108); padding: 3px 8px 3px 10px; font-size: 9px; background-color: rgb(248, 248, 248);"&gt;&lt;a href="javascript:CopyToClipboard('id_5562018867')" style="text-decoration: none; color: rgb(160, 160, 160);"&gt;copy to clipboard&lt;/a&gt;&lt;a style="float: right; color: rgb(160, 160, 160); margin-top: -12px;" href="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol style="border-left: 3px solid rgb(108, 226, 108); margin: 0px 0px 1px 45px ! important; padding: 0px; list-style-type: decimal; list-style-image: none; list-style-position: outside; background-color: rgb(255, 255, 255); color: rgb(92, 92, 92); line-height: 14px;"&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;static&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;class&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; ConvertUtils  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;public&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;static&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;object&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; ToType(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;object&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; originalValue, Type targetType)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (targetType == &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;            &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;return&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; originalValue.ToString();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (targetType == &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;))  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;            &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;return&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;int&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Parse(originalValue.ToString());  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;throw&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; Exception(  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;            &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;.Format(  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;            &lt;span style="color:blue;"&gt;"Type {0} is not expected."&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;,  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;            originalValue.GetType().FullName));  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Если есть необходимость можно расширить метод до ToType(object originalValue, Type originalType, Type targetType)&lt;br /&gt;&lt;br /&gt;2. Заводим "словарик" для преобразования данных:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: medium none ; margin: 0pt; padding: 1px 0pt 0pt; overflow: auto; font-weight: normal; font-family: Consolas,Monaco,Courier New,Courier,monospace ! important; font-size: 12px; background-color: rgb(231, 229, 220);"&gt;&lt;div style="padding-left: 45px;" id="id_2294288083"&gt;&lt;div style="border-left: 3px solid rgb(108, 226, 108); padding: 3px 8px 3px 10px; font-size: 9px; background-color: rgb(248, 248, 248);"&gt;&lt;a href="javascript:CopyToClipboard('id_2294288083')" style="text-decoration: none; color: rgb(160, 160, 160);"&gt;copy to clipboard&lt;/a&gt;&lt;a style="float: right; color: rgb(160, 160, 160); margin-top: -12px;" href="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol style="border-left: 3px solid rgb(108, 226, 108); margin: 0px 0px 1px 45px ! important; padding: 0px; list-style-type: decimal; list-style-image: none; list-style-position: outside; background-color: rgb(255, 255, 255); color: rgb(92, 92, 92); line-height: 14px;"&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: black;color:#00e000;" &gt;var migrateDictionary = &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; SortedDictionary&lt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;, type=&lt;/span&gt;&lt;span style="color:blue;"&gt;""&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;&gt;()  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        { &lt;span style="color:blue;"&gt;"___п_п"&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;long&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;) },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        { &lt;span style="color:blue;"&gt;"___свид_"&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;) },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;        { &lt;span style="color:blue;"&gt;"Наименование_СИТ"&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;typeof&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;string&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;) },  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    };  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Можно расширить словарик до такого вида:&lt;br /&gt;&lt;br /&gt;Ключ = Имя исходного поля + его тип&lt;br /&gt;Значение = Имя целевого поля + его тип&lt;br /&gt;&lt;br /&gt;3. И непосредственно реализация метода по переносу данных. Ни зависит ни от чего, разве что от ADO.NET, а именно типов DataRow, DataTable, DataSet :)&lt;br /&gt;&lt;br /&gt;&lt;div style="border: medium none ; margin: 0pt; padding: 1px 0pt 0pt; overflow: auto; font-weight: normal; font-family: Consolas,Monaco,Courier New,Courier,monospace ! important; font-size: 12px; background-color: rgb(231, 229, 220);"&gt;&lt;div style="padding-left: 45px;" id="id_0222756455"&gt;&lt;div style="border-left: 3px solid rgb(108, 226, 108); padding: 3px 8px 3px 10px; font-size: 9px; background-color: rgb(248, 248, 248);"&gt;&lt;a href="javascript:CopyToClipboard('id_0222756455')" style="text-decoration: none; color: rgb(160, 160, 160);"&gt;copy to clipboard&lt;/a&gt;&lt;a style="float: right; color: rgb(160, 160, 160); margin-top: -12px;" href="http://aivolkov.ru/online-syntax-highlighter/"&gt;подсветка кода&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol style="border-left: 3px solid rgb(108, 226, 108); margin: 0px 0px 1px 45px ! important; padding: 0px; list-style-type: decimal; list-style-image: none; list-style-position: outside; background-color: rgb(255, 255, 255); color: rgb(92, 92, 92); line-height: 14px;"&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 130, 0);"&gt;// Объекты DataRow естественно реально существуют :)&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;DataRow sourceDataRow = &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;DataRow targetDataRow = &lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;foreach&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; (var migrateInfo &lt;/span&gt;&lt;span style="color: rgb(0, 102, 153); font-weight: bold;"&gt;in&lt;/span&gt;&lt;span style="color: black;color:#00e000;" &gt; migrateDictionary)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    var columnName = migrateInfo.Key;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    var targetType = migrateInfo.Value;  &lt;/span&gt;&lt;/li&gt;&lt;li  style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    var sourceValue = sourceDataRow[columnName];  &lt;/span&gt;&lt;/li&gt;&lt;li color="inherit" style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;    targetDataRow[columnName] = ConvertUtils.ToType(sourceValue, targetType);  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(255, 255, 255); color: inherit;"&gt;&lt;span style="color: black;color:#00e000;" &gt;  &lt;/span&gt;&lt;/li&gt;&lt;li style="margin: 0pt; padding: 0pt 3px 0pt 10px; background-color: rgb(248, 248, 248); color: rgb(92, 92, 92);"&gt;&lt;span style="color: black;color:#00e000;" &gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Итого задача сводится только к заполнению словарей, которые описывают алгоритм миграции. Т.е. по сути метод на вход ожидает предельно простые структуры данных, а реализация самого метода пишется один раз для миграции разных типов данных из разных таблиц.&lt;br /&gt;&lt;br /&gt;Надеюсь что идея понятна. Не сочтите меня за велосипедостроителя. Я знаю что подобных примеров масса в интернете, и просто хочу донести эту мысль до тех, кто читает этот блог :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1195727686843699093?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1195727686843699093/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1195727686843699093' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1195727686843699093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1195727686843699093'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/08/blog-post.html' title='Миграция данных из одной таблицы в другую. Гибкое решение.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-942350227345008545</id><published>2008-07-30T14:59:00.000-07:00</published><updated>2008-07-30T15:02:57.166-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Ubuntu Linux и менеджер пакетов от Debian.</title><content type='html'>Провел небольшой эксперимент на тему "насколько хороша ОС Ubuntu Linux (и менеджер пакетов от Debian в частности)".&lt;br /&gt;&lt;br /&gt;Лично я просто обажаю систему управления пакетами в Linux, она насколько логичная, мощная и гибкая, что я в нее просто влюблен :)&lt;br /&gt;&lt;br /&gt;Неоднократно испытавал на прочность различными способами менеджер пакетов в Ubuntu.&lt;br /&gt;&lt;br /&gt;Оставим вопросы о моем ментальном здоровье, вопросы о том, какое ПО нужно устанавливать и использовать. Все же для меня пока ОС Linux это в первую очередь полигон для ведение варварских экспериментов.&lt;br /&gt;&lt;br /&gt;Я сделал следующее:&lt;br /&gt;1. Запустил Krusader 2.0 SVN trunk (KDE4/Qt4)&lt;br /&gt;2. Запустил из под него Konsole (KDE3/Qt3)&lt;br /&gt;3. Запустил менеждер пакетов Synaptic и отметил для удаления библиотеку Qt3 и все от нее зависящие&lt;br /&gt;4. Применил изменения, после чего менеджер пакетов удалил мне весь KDE3 и все Qt3 приложения, однако я с нетерпением ждал что же будет с приложением Konsole которое было запущено. Причем это приложение не бездействовало, в нем происходила компиляция Krusader 2.0, ветки trunk.&lt;br /&gt;5. Закрыл Krusader 2.0 SVN trunk&lt;br /&gt;6. Дождался окончания компиляции и обновления Krusader 2.0 в окне Konsole&lt;br /&gt;7. Закрыл окно Konsole, попытался повторно запустить это приложение, но мне сообщили что оно было удалено.&lt;br /&gt;8. Вуаля, это просто великолепно!&lt;br /&gt;&lt;br /&gt;Остается надеятся что никаких "хвостов" из-за таких финтов на моем жестком не осталось, а вы как считаете?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-942350227345008545?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/942350227345008545/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=942350227345008545' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/942350227345008545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/942350227345008545'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/07/ubuntu-linux-debian.html' title='Ubuntu Linux и менеджер пакетов от Debian.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6487820981332314704</id><published>2008-06-19T09:34:00.000-07:00</published><updated>2008-06-19T09:37:37.439-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='IronPython'/><title type='text'>Динамические языки в .NET проектах не за горами</title><content type='html'>Думаю что многие из .NET разработчиков уже неоднократно слышали о &lt;a href="http://en.wikipedia.org/wiki/IronPython"&gt;IronPython&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Да, действительно, поддержка настоящего скриптового языка была бы для такой серьезной платформы как .NET очень кстати.&lt;br /&gt;&lt;br /&gt;IronPython начинал разрабатываться вначале независимым разработчиком, который в последствии перешел под крыло Microsoft.&lt;br /&gt;&lt;br /&gt;Я начинал использовать IronPython еще когда для него не было никакой современной инструментальной поддержки.&lt;br /&gt;&lt;br /&gt;Скажу что занятие это не то чтобы совсем уж тяжелое, но все-таки требует некоторой выдержки от разработчика.&lt;br /&gt;&lt;br /&gt;Около полугода назад я ознакомился с &lt;a href="http://www.codeplex.com/IronPythonStudio"&gt;IronPython Studio&lt;/a&gt;, средой разработки на языке IronPyton, которая была выполнена на базе Visual Studio 2008 Shell (isolated mode). Если проще, то это отдельная среда, как две капли воды похожая на Visual Studio 2008, однако исключительно для этого языка.&lt;br /&gt;&lt;br /&gt;Сегодня я &lt;a href="http://blogs.msdn.com/vsxteam/archive/2008/03/31/ironpython-studio-1-0-for-isolated-and-integrated-vs-shell.aspx"&gt;узнал&lt;/a&gt; о существовании IronPython Studio на базе Integrated Shell, что дает возможность сопровождать проекты на IronPython в одном решении вместе с проектами на других языках. А это уже совсем другая история... Очень надеюсь, что я не ошибаюсь на этот счет :)&lt;br /&gt;&lt;br /&gt;Интересующимся рекомендую взглянуть на подкаст, который можно взять &lt;a href="http://www.codeplex.com/IronPythonStudio/Release/ProjectReleases.aspx?ReleaseId=8934"&gt;тут&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6487820981332314704?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6487820981332314704/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6487820981332314704' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6487820981332314704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6487820981332314704'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/06/net.html' title='Динамические языки в .NET проектах не за горами'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6833594472214869280</id><published>2008-06-06T04:21:00.000-07:00</published><updated>2008-06-06T04:24:27.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Метод Path.Combine, который собирает путь из многочисленного набора аргументов.</title><content type='html'>Набрел на &lt;a href="http://www.mohundro.com/blog/2008/02/05/DontYouWishPathCombineSupportedMultipleArgumentsOutOfTheBox.aspx"&gt;статью&lt;/a&gt;,  которая открыла мне глаза :)&lt;br /&gt;&lt;br /&gt;Почему-то я постоянно использовал неудобный Path.Combine(string, string) и  ничего с этим не делал.&lt;br /&gt;&lt;br /&gt;Настало время перемен :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6833594472214869280?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6833594472214869280/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6833594472214869280' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6833594472214869280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6833594472214869280'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/06/pathcombine.html' title='Метод Path.Combine, который собирает путь из многочисленного набора аргументов.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-645351207861566332</id><published>2008-05-18T15:11:00.000-07:00</published><updated>2008-12-11T19:54:24.270-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Очень креативный скрин с LORа</title><content type='html'>Друзья, эта картинка просто выносит мозг.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_njaJts9FAds/SDCqhdKy3-I/AAAAAAAAAB0/7whPFVstQOQ/s1600-h/2735710.png"&gt;&lt;img src="http://2.bp.blogspot.com/_njaJts9FAds/SDCqhdKy3-I/AAAAAAAAAB0/7whPFVstQOQ/s400/2735710.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_njaJts9FAds/SDCqhdKy3-I/AAAAAAAAAB0/7whPFVstQOQ/s400/2735710.png" alt="" id="BLOGGER_PHOTO_ID_5201845061355233250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Я думаю что после этого скриншота вопросов о пределах креативности сообщества пользователей Linux вообще не будет...&lt;br /&gt;&lt;br /&gt;...после того как пройдет истерика, традиционно прочесть все &lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=2735710"&gt;комментарии&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-645351207861566332?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/645351207861566332/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=645351207861566332' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/645351207861566332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/645351207861566332'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/05/lor.html' title='Очень креативный скрин с LORа'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_njaJts9FAds/SDCqhdKy3-I/AAAAAAAAAB0/7whPFVstQOQ/s72-c/2735710.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-7054089226608179119</id><published>2008-04-02T08:03:00.000-07:00</published><updated>2008-04-02T08:10:52.802-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><title type='text'>Правила внятной обработки ошибок на .NET</title><content type='html'>&lt;div&gt;Я довольно неравнодушно отношусь  к организации обработки ошибок.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Недавно нашел одну полезную статью, правда на английском языке.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;В любом случае стоит прочесть, потому как там содержится выжимка всех  приемов, которые стоит использовать при программировании на .NET:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;&lt;a href="http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx"&gt;http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;От себя добавлю, что даже я не соблюдаю все из перечисленных автором  моментов. &lt;/div&gt; &lt;div&gt; &lt;/div&gt; &lt;div&gt;Естественно, что это очень плохо...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-7054089226608179119?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/7054089226608179119/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=7054089226608179119' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7054089226608179119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7054089226608179119'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/04/net.html' title='Правила внятной обработки ошибок на .NET'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6824743901660281170</id><published>2008-03-06T12:51:00.000-08:00</published><updated>2008-03-06T12:58:05.206-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><category scheme='http://www.blogger.com/atom/ns#' term='Movie'/><title type='text'>Фильм "Семь"</title><content type='html'>На днях еще раз посмотрел фильм "Семь".&lt;br /&gt;&lt;br /&gt;Все-таки Кевин Спейси очень хороший актер. Удивительно, но в такое короткое время, которое он был в кадре, он очень хорошо показал своего героя - серийного убийцу.&lt;br /&gt;&lt;br /&gt;Очень понравился его диалог с детективом. Если кто фильм не видел, рекомендую посмотреть в обязательном порядке. Я даже диалог двух детективов с Джоном До несколько раз пересмотрел в оригинальной озвучке.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Джон&lt;/span&gt;:    Ничего плохого если человек любит свое дело,&lt;br /&gt;        Не буду отрицать, что хочу повернуть грех против грешников&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Милз&lt;/span&gt;:    Подожди, но ты же убиваешь невинных&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Джон&lt;/span&gt;:    Невинных? Это шутка такая?&lt;br /&gt;        Этот жирняк, который на ногах не стоял.&lt;br /&gt;        Ты бы обсмеял его с дружками на улице&lt;br /&gt;        Если ты увидишь его, когда сам ешь, то ты не доешь до конца&lt;br /&gt;        Потом был адвокат, вы должны мне спасибо сказать за это&lt;br /&gt;        Этот человек делал деньги на лжи чтобы насильники и убийцы были на воле&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Милз&lt;/span&gt;:    Убийцы...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Джон&lt;/span&gt;:    А женщина...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Милз&lt;/span&gt;:   Убийцы как ты сам, Джон&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Джон&lt;/span&gt;:    Женщина! Такая гадкая внутри, что не смогла бы жить, если только не ее красота снаружи&lt;br /&gt;        Торговец наркотиками, педераст и торговец наркотиками&lt;br /&gt;        Не забудем про шлюху, разносчицу заразы&lt;br /&gt;        Только в этом гавеном мире можно сказать что эти люди невинны&lt;br /&gt;        И сказать это не смеясь, вот в чем проблема&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вывод.&lt;br /&gt;&lt;br /&gt;Люблю фильмы, которые способны вызвать во мне сильные эмоции. Не важно положительные или отрицательные, стресс или расслабление, принесет мне радость или  нагнетет на меня ощущение глубочайшего разочарования...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6824743901660281170?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6824743901660281170/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6824743901660281170' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6824743901660281170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6824743901660281170'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/03/blog-post.html' title='Фильм &quot;Семь&quot;'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-5765171400452886102</id><published>2008-02-20T02:39:00.000-08:00</published><updated>2008-02-20T02:41:41.441-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2003'/><title type='text'>Очень полезный Add-in для VS 2003</title><content type='html'>Кому как, а мне иногда в дебагере очень хочется посмотреть содержимое DataSet :)&lt;br /&gt;&lt;br /&gt;Причем хочется посмотреть содержимое целиком. А еще хочется скопировать содержимое, вставить в Exel и поиграться с автофильтрами...&lt;br /&gt;&lt;br /&gt;В общем много чего разного хочется, и я вот узнал что все это оказывается очень даже возможно :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/macros/dswatch.aspx"&gt;Special QuickWatch for a DataSet&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-5765171400452886102?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/5765171400452886102/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=5765171400452886102' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5765171400452886102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5765171400452886102'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2008/02/add-in-vs-2003.html' title='Очень полезный Add-in для VS 2003'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-944080163504019137</id><published>2007-12-23T10:23:00.000-08:00</published><updated>2007-12-23T10:42:05.742-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><title type='text'>Особенности восприятия против реалий Web-дизайна</title><content type='html'>Сегодня испытал на себе достаточно занятные ощущения.&lt;br /&gt;&lt;br /&gt;Все выходные я занимался изучением существующего рынка продуктов, которые обеспечивают миграцию данных между СУБД различных поставщиков.&lt;br /&gt;&lt;br /&gt;Может быть проблема была в моей усталости, либо в чем-то другом, но вот на &lt;a href="http://www.dbbalance.com/"&gt;этом&lt;/a&gt; сайте я потратил неприлично много времени, прежде чем таки нашел то, что искал.&lt;br /&gt;&lt;br /&gt;Меня интересовало, какие именно СУБД поддерживает программный продукт. В итоге, после ~5 минутного чтения по-диагонали страниц на сайте я таки обнаружил эту информацию.&lt;br /&gt;&lt;br /&gt;Естественно, что эта информация отражалась непосредственно на главной странице сайта.&lt;br /&gt;&lt;br /&gt;Каким-то чудом я отсеил как раз ту часть страницы, на которой как раз находилась ключевая информация! Любопытно, не правда ли? :)&lt;br /&gt;&lt;br /&gt;Я призадумался. И понял в чем дело. Секция сайта, которая отражала нужную мне информацию напомнила мне рекламный баннер, поэтому мой мозг взял, да и отсеял ее :)&lt;br /&gt;&lt;br /&gt;Действительно, опираясь на мой жизненный опыт, я перестал обращать внимания на  цветные, яркие анимированные фрагменты, включенные в страницу.&lt;br /&gt;&lt;br /&gt;Так что рекламщикам меня не подцепить :))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-944080163504019137?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/944080163504019137/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=944080163504019137' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/944080163504019137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/944080163504019137'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/12/web.html' title='Особенности восприятия против реалий Web-дизайна'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3016774144105630825</id><published>2007-12-01T07:43:00.000-08:00</published><updated>2007-12-01T07:50:01.237-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Exception Handling'/><title type='text'>Суббота. Работа. Ужасное настроение.</title><content type='html'>Сегодня наткнулся на грабли с типизированными DataSet, на которые раньше очень часто наступал, но в последнее время этого удавалось избегать.&lt;br /&gt;&lt;br /&gt;Видимо это связано с повышением профессионализма :)&lt;br /&gt;&lt;br /&gt;Но сегодня как раз тот самый день. И я сижу и наблюдаю эту чертовски загадочное сообщение об ошибке:&lt;br /&gt;Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.&lt;br /&gt;&lt;br /&gt;Какой constraint, какое поле, какой not null, какой уникальный, какой внешний ключ?! ....&lt;br /&gt;&lt;br /&gt;Неужели бравые ребята в MS не имели возможности это сделать? Они же умные, не то что я...&lt;br /&gt;&lt;br /&gt;Помогите, поделитесь опытом. Какой методологией вы пользуетесь для выявления источника проблемы? :(&lt;br /&gt;&lt;br /&gt;Stack trace целиком, если кому интересно:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;System.Data.ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.DataSet.FailedEnableConstraints()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.DataSet.EnableConstraints()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.DataSet.set_EnforceConstraints(Boolean value)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.DataTable.EndLoadData()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3016774144105630825?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3016774144105630825/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3016774144105630825' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3016774144105630825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3016774144105630825'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/12/blog-post.html' title='Суббота. Работа. Ужасное настроение.'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1921333928246798124</id><published>2007-11-17T05:52:00.000-08:00</published><updated>2007-11-17T05:55:56.491-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='soft'/><title type='text'>Список свободного ПО для Windows и обычного пользователя :)</title><content type='html'>Я сторонник открытого программного обеспечения. Уверен, что кроме глюков, сторонее ПО обладает гораздо большей гибкостью.&lt;br /&gt;&lt;br /&gt;Сегодня общался со своим товарищем, рассказывал ему про свободное ПО и как раз созрела небольшая заметка :)&lt;br /&gt;&lt;br /&gt;Итак, список свободного ПО под Windows для среднестатистического, обычного пользователя:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OpenOffice.org&lt;/span&gt; - Рекомендую поставить и поработать в нем. По-моему мнению последние версии выполняют 100% нужд обычных пользователей.&lt;br /&gt;&lt;br /&gt;Работать в нем стоти только с документами родного формата, несмотря на то, что он прекрасно понимает формат Microsoft Office. Просто так загрузка документа будет в несколько раз быстрее.&lt;br /&gt;&lt;br /&gt;Единственная пока в нем проблема, отсутствие хорошей совместимости с Microsoft Access.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firefox&lt;/span&gt; - браузер. Вообще отказываюсь комментировать. Все остальные браузеры в топку. Точка :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7-zip&lt;/span&gt; - упаковщик. может распаковывать RAR 3.0 архивы. Рекомендую формат 7Z для упаковки, по сравнению с ним RAR проигрывает по степени сжатия. В крайнем случае формат ZIP никто не отменял.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mozilla Thunderbird&lt;/span&gt; - почтовый клиент. один мой товарищ, продвинутый пользователь сказал что у этой программы нехватает только одной! фичи, которая есть в коммерческом The Bat! Но эта фича, реально нужна только системным администраторам. По-правде говоря я даже не помню что он говорил... :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Miranda&lt;/span&gt; - многопротокольный клиет для обмена мгновенными сообщениями. В стандартной поставке требует большого количества времени для настройки. Имеет мощнейшую систему плагинов. Рекомендую использовать уже скомпонованные сборки типа Miranda IM - LEM pack или Miranda IM zeleboba's pack&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;VLC Media Player&lt;/span&gt; - видеплеер, который идет в поставке с набором своих самостоятельных кодеков. Умеет воспроизводить большинство распространенных форматов, а так же недокаченное видео. В отличие от других плееров не рвет видео высокого разрешения в процессе просмотра через Wi-Fi сеть.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MPlayer&lt;/span&gt; - видеоплеер, который также имеет свои собственные кодеки. Работает без установки - достаточно распаковать архив. После установки 60-мб пакета кодеков воспроизводит АБСОЛЮТНО ВСЁ. Использую как альтернативный плеер. Есть проблемы с работой под Windows Vista.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notepad++&lt;/span&gt; - очень удобный текстовый редактор. Убийца стандартного блокнота. В большей степени полезен программистам, в меньшей - рядовому пользователю.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WinDjView&lt;/span&gt; - программа для просмотра электронный книг в формате DejaVu. Документы формата DejaVu имеют расширение .djvu и для неопытного пользователя чем-то напоминают PDF, но при этом документы намного комактнее из-за того, что там применяется сжатие векторного изображения.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S. Естественно, что этот списк можно дополнить софтом для гиков. Может быть я это когда-нибудь и сделаю.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1921333928246798124?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1921333928246798124/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1921333928246798124' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1921333928246798124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1921333928246798124'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/11/windows.html' title='Список свободного ПО для Windows и обычного пользователя :)'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4420430540468814918</id><published>2007-11-09T02:08:00.000-08:00</published><updated>2008-05-13T03:13:03.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lifehack'/><title type='text'>Самый быстрый способ посчитать число уникальных строк</title><content type='html'>Самый быстрый способ посчитать число уникальных (и не уникальных) строк.&lt;br /&gt;&lt;br /&gt;Предположим, есть входные данные:&lt;br /&gt;abc&lt;br /&gt;bcd&lt;br /&gt;bcd&lt;br /&gt;def&lt;br /&gt;efg&lt;br /&gt;fgh&lt;br /&gt;efg&lt;br /&gt;&lt;br /&gt;Нужно по-быстренькому проверить, что все записи будут уникальны.&lt;br /&gt;&lt;br /&gt;Для этого может пригодится Microsoft Exel.&lt;br /&gt;&lt;br /&gt;Вставляем этот список значений в столбец.&lt;br /&gt;Добавляем эту формулу =+COUNTIF($A$1:$A$7,A1)  в той же строке что и наша первая запись.&lt;br /&gt;&lt;br /&gt;При этом нужно проследить чтобы диапазон, заданный в абсолютных координатах A$1:A$7 полностью охватывал все входные данные.&lt;br /&gt;&lt;br /&gt;После того как одна ячейка заполнена формулой нужно размножить формулу ровно на все строки данных. Для этого нужно "перетащить" мышью за нижний правый край ячейку с нашей первой формулой.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;После этого вы можете увидеть количество повторений каждой строки в исходной коллекции. Можно для эффективности поиска воспользоваться автофильтром.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4420430540468814918?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4420430540468814918/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4420430540468814918' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4420430540468814918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4420430540468814918'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/11/blog-post.html' title='Самый быстрый способ посчитать число уникальных строк'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6184522339842997143</id><published>2007-11-08T09:37:00.000-08:00</published><updated>2007-11-08T09:41:15.550-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Чем отличаются ASP.NET проекты Web Application и Web Site</title><content type='html'>Нашел довольно внятное объяснение &lt;a href="http://msdn2.microsoft.com/en-us/library/Aa730880%28VS.80%29.aspx"&gt;тут&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Общий вывод. Web Site проект это настоящий шлак, который допустим к использованию только в детском саду.&lt;br /&gt;&lt;br /&gt;Самое обидное, что проект типа Web Application доступен только начиная с Visual Studio 2005 SP1. В оригинальной 2005-й студии его упразднили... как мы видим по service paсk'у - неудачный ход.&lt;br /&gt;&lt;br /&gt;Есть есть конструктивные замечания против. Буду рад услышать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6184522339842997143?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6184522339842997143/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6184522339842997143' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6184522339842997143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6184522339842997143'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/11/aspnet-web-application-web-site.html' title='Чем отличаются ASP.NET проекты Web Application и Web Site'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-7163362356412979143</id><published>2007-11-08T05:41:00.000-08:00</published><updated>2007-11-08T09:46:37.112-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Необычное поведение индексатора у XmlAttributeCollection</title><content type='html'>В .NET 1.1 этот код НЕ работает:&lt;br /&gt;&lt;br /&gt;ExtraCell extraCell = new ExtraCell(&lt;br /&gt;node.Attributes[ATTRIBUTE_NAME].Value,&lt;br /&gt;node.Attributes[ATTRIBUTE_VALUE].Value);&lt;br /&gt;&lt;br /&gt;а этот - работает:&lt;br /&gt;&lt;br /&gt;ExtraCell extraCell = new ExtraCell(&lt;br /&gt;node.Attributes.GetNamedItem(ATTRIBUTE_NAME).Value,&lt;br /&gt;node.Attributes.GetNamedItem(ATTRIBUTE_VALUE).Value);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Остается открытым вопрос... кто виноват :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Как оказалось были виноваты мои руки... прошу меня простить за совершенно бесполезный пост :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-7163362356412979143?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/7163362356412979143/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=7163362356412979143' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7163362356412979143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7163362356412979143'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/11/xmlattributecollection.html' title='Необычное поведение индексатора у XmlAttributeCollection'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3524681777732817377</id><published>2007-10-14T06:30:00.000-07:00</published><updated>2007-10-14T06:31:13.318-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IRC'/><category scheme='http://www.blogger.com/atom/ns#' term='Miranda'/><title type='text'>Miranda. Проблемы с unicode версией irc.dll</title><content type='html'>&lt;b&gt;status_alexus&lt;/b&gt;: привет&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: +&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: Miranda IM 0.7.0.48 (IRC v.0.7.0.2 Unicode)&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: это у тебя&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: ты знаешь, тут Саша Белый один бажок нашел&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: если ты юзаешь юникодовую версию irc.dll&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: пишет 0.7&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: то к тебе не приходят сообщения от пользователей имя которых начинается с большой русской буквы С&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: :)&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: да ну&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: &lt;b&gt;ctype&lt;/b&gt; я тебе серьезно говорю&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: короче мы тут мудились с полчасика&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: я попробовал все порты (читай кодировки) которые поддерживает сервак онеат&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: г.м. я сам на себя послал - приходит&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: ircd-RU!&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: да. но у тебя же с латинской С&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: а я говорю о заглавной русской&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: ну я заглавную русскую себе послал&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: так вот&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: а. от пользовоталей&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: и только в одном случае я видел сообщения от такого пользователя&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: прикольно&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: когда подключался в режиме транслита&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: но тогда от него приходил транслит, а мне приходилось отправлять латиницей&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: и ник соотв. его начинался с S&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: такие от грабли :(&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: гы. вообще-то у мну нет знакомых с русскими никами&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: Аналогично ;)&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: так что это не баг, эта фича :)&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: в общем я буду юзать новый глючный плагин ирки в миранде :)&lt;br /&gt;&lt;b&gt;Sasha_Beluj&lt;/b&gt;: =))&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: а кто юзает ники на русском в IRC пускай идут гулять лесом&lt;br /&gt;&lt;b&gt;Sasha_Beluj&lt;/b&gt;: да не. Даже не так&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: а как?&lt;br /&gt;&lt;b&gt;Sasha_Beluj&lt;/b&gt;: те, кто юзает ники с большой буквы С пусть идут гулять :)&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: не важно&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: Кошечки, Ромашки и Писечки тоже пусть гуляют...&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: меня только один глюк волнует - досихпор rss переодически падает. и плагин без исходников&lt;br /&gt;&lt;b&gt;status_alexus&lt;/b&gt;: я RSS давно читаю через Google Reader&lt;br /&gt;&lt;b&gt;Sasha_Beluj&lt;/b&gt;: А глюк с буквой С большой не волнует? :)&lt;br /&gt;&lt;b&gt;ctype&lt;/b&gt;: Sasha_Belu. абсалютна&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3524681777732817377?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3524681777732817377/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3524681777732817377' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3524681777732817377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3524681777732817377'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/10/miranda-unicode-ircdll.html' title='Miranda. Проблемы с unicode версией irc.dll'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-2655012578341729638</id><published>2007-10-03T06:50:00.000-07:00</published><updated>2008-12-11T19:54:24.633-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox HTML Validator</title><content type='html'>Нашел довльно любопытное расширение для Firefox.&lt;br /&gt;&lt;br /&gt;На &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/249"&gt;странице&lt;/a&gt; находится следующее описание:&lt;br /&gt;&lt;br /&gt;Расширение основано на Tidy и OpenSP (SGML Parser). Оба алгоритма были разработаны консорциумом W3C. Оба алгоритма встраиваются внутрь Mozilla Firefox и проводят валидацию локально на вашем компьютере без отправки HTML на сервер третьей стороны.&lt;br /&gt;&lt;br /&gt;Любопытно, насколько влияет работа этого плагина на общую производительность во время серфинга.&lt;br /&gt;&lt;br /&gt;Окно конфигурации, которое появилось после установки:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_njaJts9FAds/RwOfCC4FwFI/AAAAAAAAABE/ia3odhq5xM4/s1600-h/Firefox_HTML_Validation.png"&gt;&lt;img src="http://3.bp.blogspot.com/_njaJts9FAds/RwOfCC4FwFI/AAAAAAAAABE/ia3odhq5xM4/s400/Firefox_HTML_Validation.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_njaJts9FAds/RwOfCC4FwFI/AAAAAAAAABE/ia3odhq5xM4/s400/Firefox_HTML_Validation.png" alt="" id="BLOGGER_PHOTO_ID_5117108459103699026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вот непосредственно "рабочее" окно валидатора:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_njaJts9FAds/RwOfJy4FwGI/AAAAAAAAABM/aBT_ZZka6sI/s1600-h/Firefox_HTML_Validation_2.png"&gt;&lt;img src="http://2.bp.blogspot.com/_njaJts9FAds/RwOfJy4FwGI/AAAAAAAAABM/aBT_ZZka6sI/s400/Firefox_HTML_Validation_2.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_njaJts9FAds/RwOfJy4FwGI/AAAAAAAAABM/aBT_ZZka6sI/s400/Firefox_HTML_Validation_2.png" alt="" id="BLOGGER_PHOTO_ID_5117108592247685218" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-2655012578341729638?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/2655012578341729638/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=2655012578341729638' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/2655012578341729638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/2655012578341729638'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/10/firefox-html-validator.html' title='Firefox HTML Validator'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_njaJts9FAds/RwOfCC4FwFI/AAAAAAAAABE/ia3odhq5xM4/s72-c/Firefox_HTML_Validation.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4398258692534265590</id><published>2007-10-02T07:13:00.000-07:00</published><updated>2007-10-02T07:15:07.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>T-SQL. Как "округлить" datetime до date?</title><content type='html'>Постоянно забываю :(&lt;br /&gt;&lt;br /&gt;convert(datetime, convert(varchar, od.SomeDateTime, 1), 1) as SomeDate&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4398258692534265590?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4398258692534265590/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4398258692534265590' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4398258692534265590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4398258692534265590'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/10/t-sql-datetime-date.html' title='T-SQL. Как &quot;округлить&quot; datetime до date?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4070021596273847378</id><published>2007-09-29T04:29:00.000-07:00</published><updated>2007-09-29T04:31:05.402-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Mail'/><category scheme='http://www.blogger.com/atom/ns#' term='CDMA'/><title type='text'>Google Mail vs Велтон телеком. Уведомления о почте</title><content type='html'>Когда-то давно, когда у меня был основной почтовый ящик на mail.ru я настраивал уведомления на почте.&lt;br /&gt;&lt;br /&gt;Я являюсь абонентом сети "Велтон-телеком" и пользователем почтового сервиса Goggle Mail и хочу поделиться как настроить уведомления о приходе новой почты.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для этого нужно зайти на сервис &lt;a href="http://gmail.com/"&gt;Google Mail&lt;/a&gt;, выбрать Settings -&gt; Forwarding and POP -&gt; Forwarding.&lt;br /&gt;&lt;br /&gt;После этого выбрать пункт "Forward a copy of incoming mail to"  и ввести почтовый адрес вида 805XXXXXXX@sms.velton.ua, который содержит семизначный номер вашего телефона.&lt;br /&gt;&lt;br /&gt;После этого по приходе новой почте вам будут приходить текстовые сообщения с номера 3333 такого вида:&lt;br /&gt;&lt;br /&gt;From: some.address+caf_=8057XXXXXXX=sms.velton.ua@gmail.com&lt;br /&gt;Date: Sat 29 Sep 2007 13^53^52+0300&lt;br /&gt;Subj: Hello world&lt;br /&gt;Text: This is a test e-mail.&lt;br /&gt;&lt;br /&gt;Однако, позже я выяснил, что если содержимое письма велико, то это письмо будет приходить кусками несколькими сообщениями.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Так что на повестке дня вопрос по-прежнему открыт.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4070021596273847378?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4070021596273847378/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4070021596273847378' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4070021596273847378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4070021596273847378'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/09/google-mail-vs.html' title='Google Mail vs Велтон телеком. Уведомления о почте'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-6814094805722318386</id><published>2007-08-27T03:33:00.001-07:00</published><updated>2007-08-27T03:33:39.965-07:00</updated><title type='text'>Total Commander и PDA</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;В связи с недавным приобретением КПК постепенно обустраиваю свое рабочее место.&lt;br/&gt;&lt;br/&gt;За последние полмесяца софта было перепробовано порядочно. Однако все время меня раздражал тот факт, что с моим устройством приходится работать через проводник, который открывается из окна ActiveSync приложения.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Буквально недавно нашел соответствующий плагин для моего единственно возможного файлового менеджера - &lt;a href='http://www.totalcmd.net/'&gt;Total Commander&lt;/a&gt; :)&lt;br/&gt;&lt;br/&gt;Плагин &lt;a href='http://www.totalcmd.net/plugring/wince.html'&gt;WinCE&lt;/a&gt; обеспечивает доступ Pocket PC, который&amp;amp;nbsp; подключен через ActiveSync соединение. Сам плагин выполнен в виде виртуальной файловой системы.&lt;br/&gt;&lt;br/&gt;В общем я доволен находкой и скорее всего буду ею пользоваться и на работе и дома.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;P.S. Руководствуясь спортивным интересом обнаружил еще плагин &lt;a href='http://forum.farmanager.com/viewtopic.php?t=2826&amp;amp;start=0&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;highlight=&amp;amp;sid=a0d20b7710b84c50f3bfd1965f6c4af0'&gt;WM Explorer&lt;/a&gt;&amp;amp;nbsp; - аналогичный плагин для &lt;a href='http://www.farmanager.com/'&gt;Far&lt;/a&gt;. Любопытно, какой же из двух этих плагинов более функциональный :)&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-6814094805722318386?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/6814094805722318386/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=6814094805722318386' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6814094805722318386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/6814094805722318386'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/08/total-commander-pda.html' title='Total Commander и PDA'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3423187367089189310</id><published>2007-08-26T16:38:00.001-07:00</published><updated>2007-08-26T16:38:10.325-07:00</updated><title type='text'>Тестирование - в массы :)</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Пару месяцев назад я проходил один занимательный тест. &lt;br /&gt;&lt;br /&gt;В результате получил следующий результат:&lt;br /&gt;&lt;br /&gt;&lt;table border='0' style='border: 1px solid rgb(238, 238, 238); width: 400px;'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style='margin: 0px; padding: 8px; text-align: center; background-color: rgb(0, 102, 128); color: rgb(255, 255, 255); font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;Составление вашего психологического портрета окончено. Результаты: Тихий Гений&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='padding: 8px; text-align: left; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;Довольно редкая и положительная психологическая группа людей. В одежде эти люди не стремятся к гламурному блеску, но умеют найти свой стиль. Волосы, например, красят редко, предпочитая натуральность и уход за кожей. Характер в целом "в штиле", но бывают редкие скачки, выливающиеся в недовольство окружающих. Их мирок кишит неуловимыми замыслами, которые они, однако, не всегда воплощают. Про таких говорят "деньги его любят". В работе Гении делают ставку на свою коммуникабельность, и редко проигрывают. У них отлично получается рисовать и пространственно мыслить, однако задания, требующие усидчивости, им будут не по плечу. Редкие люди, видящие душу Тихого Гения насквозь, ценят и уважают его как друга. Люди этого типа чувствуют свою связь с богом и людьми. Опасными друзьями могут стать попытки забыться от мира: телевизор, компьтер, алкоголь, наркотики.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='margin: 0px; padding: 8px; text-align: center; background-color: rgb(0, 102, 128); font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;&lt;a style='color: rgb(255, 255, 255);' href='http://aeterna.ru/test.php?link=tests:5516'&gt;Пройти тест&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;А сегодня прошел еще один:&lt;br /&gt;&lt;br /&gt;&lt;table border='0' style='border: 1px solid rgb(238, 238, 238); width: 400px;'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style='margin: 0px; padding: 8px; text-align: center; background-color: rgb(0, 102, 128); color: rgb(255, 255, 255); font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;Обратив взор свой в бездну, понял ты, что сила в тебе есть - Надежда&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='padding: 8px; text-align: left; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;Мы знать, не знаем и не помним, пока не встретимся с бедой, что весь наш мир такой огромный весит на ниточке одной, она ... В палящий зной, Вы тень на горизонте, в кромешной тьме Вы света луч. Вам не приходила в голову мысль, что если  во мраке, горит хотя бы один огонёк, то свет не сможет погибнуть никогда! Вы тот, что дарит надежду, на спасение, поддержку близким друзьям, для них вы луч в тёмном царстве. Для света Вы последняя надежда!   &lt;img align='left' alt='image' src='http://pics.livejournal.com/fenix1329/pic/0005tgab'/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='margin: 0px; padding: 8px; text-align: center; background-color: rgb(0, 102, 128); font-family: Arial; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;'&gt;&lt;a style='color: rgb(255, 255, 255);' href='http://aeterna.ru/test.php?link=tests:12902'&gt;Пройти тест&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вот такие вот дела. Если подойти к результатам с некоторой долей юмора, то можно сделать вывод "тихий гений, подающий надежды" :)  ...довольно оптимистично ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3423187367089189310?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3423187367089189310/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3423187367089189310' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3423187367089189310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3423187367089189310'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/08/blog-post_26.html' title='Тестирование - в массы :)'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8698333112153706754</id><published>2007-08-21T14:22:00.001-07:00</published><updated>2007-08-21T14:22:41.634-07:00</updated><title type='text'>Вожделенное приобретение</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Совсем недавно купил себе КПК, о котором достаточно давно мечтал.&lt;br/&gt;&lt;br/&gt;Очень долго колебался и выбирал что же лучше всего себе приобрести. Мой выбор затянулся наверное на целый год, а может быть и на полтора :)&lt;br/&gt;&lt;br/&gt;Так или иначе он пошел мне на пользу. Потому что как-то я чуть было не приобрел себе &lt;a href='http://www.hpc.ru/devices/device.php?dev_id=598'&gt;Dell X51&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Вообще это была занятная история. Я уже собрал все свое нажитое и отправился с одним своим товарищем в магазин за покупкой сего девайса, выбил чек и пошел с ним получать наладонник.&lt;br/&gt;&lt;br/&gt;Однако, после моей ревизии содержимого коробки стало очевидна нехватка кабеля который должен был идти с ним в поставке. Т.е. складывалась ситуация, обязывающая меня таскать с собой всегда кредл.&lt;br/&gt;&lt;br/&gt;Естественно, ребята на выдаче пытались мне впарить этот девайс. Однако я сделал волевое решение и затребовал либо дополнения некомплекта либо возврат денег.&lt;br/&gt;&lt;br/&gt;Как раз в тот момент более в наличии этих КПК не было мне вернули деньги.&lt;br/&gt;&lt;br/&gt;И вот, спустя больше года и совершенно в другом магазине я таки себе приобрел совершенно другой по классу девайс - &lt;a href='http://www.ferra.ru/online/mobilis/s26496/print/'&gt;Fujitsu Siemens Pocket Loox C550&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Так что я доволен что тогда я таки не сделал эту покупку, потому как технологии за это время не стояли на месте.&lt;br/&gt;&lt;br/&gt;Естественно что этот девайс был несколько дороже. &lt;br/&gt;&lt;br/&gt;Как говориться сегодня раки (Fujitsu-Siemens) были большие, но за $520 против вчерашних, маленьких (Dell X51) но за $400 ;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;В общем я крайне доволен функциональностью этого умного устройства, если бы не одно НО!&lt;br/&gt;&lt;br/&gt;Софт, который осуществляет поддержку Wi-Fi от производителя мало того что малополезный, дык он еще и вредоносный :(&lt;br/&gt;&lt;br/&gt;Программу CONNECTMOBILITY-E2C необходимо засовывать непосредственно в естественное отверстие разработчикам. Простите пожалуйста, уважаемые коллеги, но такой софт должно быть стыдно поставлять конечному покупателю.&lt;br/&gt;&lt;br/&gt;После того, как я посвятил этой программе достаточно большое время и проколдовал со своим КПК наверное две недели подряд (от случая к случаю, в свободное время) в конечном счете мне открылась святая истина...&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Вот целая &lt;a href='http://www.hpc.ru/pda/board/index.php?t=122317'&gt;ветка&lt;/a&gt; бесконечно благодарных пользователей этой программы...&lt;br/&gt;&lt;br/&gt;&lt;i&gt;"вобщем после хард ресета n560 пикнет и все что было до этого&lt;br /&gt;установлено будет удалено. теперь ни в коем случае не запускаем e2c,&lt;br /&gt;удалить ее не получится т.к. она вшита в винду, но можно просто не&lt;br /&gt;запускать ее."&lt;br/&gt;&lt;br/&gt;&lt;/i&gt;В общем это оказалось абсолютной правдой. При первом запуске эта замечательная программа вправляет мозг мобильной операционке и лечить это проще всего ампутацией памяти вашего мобильноо питомца...&lt;br/&gt;&lt;br/&gt;Такие вот забавные программки поставляются с КПК. Обхохочешься...&lt;br/&gt;&lt;b&gt;&lt;a href='http://www.hpc.ru/pda/board/index.php?t=76816'&gt; &lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8698333112153706754?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8698333112153706754/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8698333112153706754' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8698333112153706754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8698333112153706754'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/08/blog-post.html' title='Вожделенное приобретение'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-7241365975269948715</id><published>2007-08-12T10:11:00.001-07:00</published><updated>2007-08-12T10:11:51.763-07:00</updated><title type='text'>Функциональные требования MP3 плееру</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Сегодня общался с товарищем по аське и в ходе беседы я вывел для себя следующие требования:&lt;br/&gt;&lt;br/&gt;- небольшие размеры, логичные пропорции&lt;br/&gt;- как можно больше отображаемых строк на экране&lt;br/&gt;- возможность заливки мелодий без дополнительного софта&lt;br/&gt;- удобное управление, возможность управления одной рукой&lt;br/&gt;- работа от стандартного элемента питания (AAA)&lt;br/&gt;- поддержка эквалайзера (бывает что нужно немного докручивать под наушники)&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-7241365975269948715?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/7241365975269948715/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=7241365975269948715' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7241365975269948715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7241365975269948715'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/08/mp3.html' title='Функциональные требования MP3 плееру'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8484382857772788687</id><published>2007-08-02T13:58:00.001-07:00</published><updated>2007-08-02T13:58:01.071-07:00</updated><title type='text'>Visual Studio 2008</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Сегодня стал счастливым обладателем версии Beta 2.&lt;br/&gt;&lt;br/&gt;Эту версию студии еще называют Orcas. В принципе я уважаю маркетинговые изыски кампаний. Если это им помогает, то пожалуйста ;)&lt;br/&gt;&lt;br/&gt;Для меня же эта студия 2008 :) Была бы моя воля я бы вообще порядковые номера вел. Без всяких премудростей. Если продукт хороший, ему вообще название не нужно...&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;В общем, если кому нужно, могу записать диск.&lt;a rel='tag' href='http://technorati.com/tag/Tools' class='performancingtags'/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8484382857772788687?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8484382857772788687/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8484382857772788687' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8484382857772788687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8484382857772788687'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/08/visual-studio-2008.html' title='Visual Studio 2008'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-5606056107154534552</id><published>2007-07-14T08:52:00.000-07:00</published><updated>2009-11-23T17:23:57.043-08:00</updated><title type='text'>Managed C++. Проба пера</title><content type='html'>Сегодня попробовал поработать с управляемым C++.&lt;br /&gt;&lt;br /&gt;Ну и в качестве упражнения хотелось попробовать что-то интересное, а не ограничиваться переписыванием примеров из того же MSDN.&lt;br /&gt;&lt;br /&gt;Поэтому мой выбор пал на одну небольшую библиотеку - minifmod. Это часть библиотеки FMOD - кроссплатформенной библиотеки для работы с различными аудиоформатами.&lt;br /&gt;&lt;br /&gt;Библиотека minifmod поставляется с открытым исходным кодом, а так же имеет в поставке статическую C-библиотеку для использования их в проектах Visual C++.&lt;br /&gt;&lt;br /&gt;Но .NET программист не сможет использовать эту библитеку, поэтому я решил это исправить.&lt;br /&gt;&lt;br /&gt;Действительно, достаточно типичная ситуация. Мы имеем огромную массу библиотек, написанных на C и C++, для того чтобы использовать вызовы к этим библиотекам можно использовать достаточно удобный интерфейс как Platform Invoke. Однако в моем случае это было невозможно, потому как это не *.dll, а static link library.&lt;br /&gt;&lt;br /&gt;Было принято решение создать проект на Managed C++, который является оберткой вокруг minifmod, а так же тестовый проект Windows Forms на C# который бы использовал мою библиотеку-обертку.&lt;br /&gt;&lt;br /&gt;Изучив исходный код minifmod я обнаружил, что сама библиотека заточена на работу с музыкальными треками как с файлами:&lt;br /&gt;&lt;pre class="prettyprint"&gt;FMUSIC_MODULE * FMUSIC_LoadSong(signed char *name, SAMPLELOADCALLBACK sampleloadcallback);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;По правде говоря меня это несколько расстроило, потому как это накладывало целый ряд ограничений на ее использование.&lt;br /&gt;&lt;br /&gt;К счастью, я обнаружил еще механизм функций обратного вызова, которые вселили в меня надежду что не все так плохо как кажется на самом деле:&lt;br /&gt;&lt;pre class="prettyprint"&gt;typedef void (*FMUSIC_CALLBACK)(FMUSIC_MODULE *mod, unsigned char param);&lt;br /&gt;&lt;br /&gt;void FSOUND_File_SetCallbacks(&lt;br /&gt; unsigned int (*OpenCallback)(char *name),&lt;br /&gt; void (*CloseCallback)(unsigned int handle),&lt;br /&gt; int (*ReadCallback)(void *buffer, int size, unsigned int handle),&lt;br /&gt; void (*SeekCallback)(unsigned int handle, int pos, signed char mode),&lt;br /&gt; int (*TellCallback)(unsigned int handle));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Итак, я решил реализовать класс, который бы как минимум умел бы воспроизводить XM-треки из файла, и как максимум - работать с объектом типа System.IO.Stream.&lt;br /&gt;&lt;br /&gt;Мне очень понравился процесс создания этой оболочки. Мне даже удалось в некоторой степени "обмануть" разработчиков, и передавать не строку с путем файла а указатель на объект типа System.IO.Stream.&lt;br /&gt;&lt;br /&gt;Вот листинг .NET класса для воспроизведения XM-файлов:&lt;br /&gt;&lt;pre class="prettyprint"&gt;namespace NModPlayer&lt;br /&gt;{&lt;br /&gt; public ref class ModPlayer : public IDisposable&lt;br /&gt; {&lt;br /&gt; private:&lt;br /&gt;     Stream^ _stream;&lt;br /&gt;     FMUSIC_MODULE* _mod;&lt;br /&gt;     GCHandle _gcHandle;&lt;br /&gt;&lt;br /&gt; public:&lt;br /&gt;&lt;br /&gt;     ModPlayer(Stream^ stream)&lt;br /&gt;     {&lt;br /&gt;         _stream = stream;&lt;br /&gt;         FSOUND_File_SetCallbacks(memopen, memclose, memread, memseek, memtell);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     void BeginPlay()&lt;br /&gt;     {&lt;br /&gt;         GCHandle _gcHandle = GCHandle::Alloc(_stream);&lt;br /&gt;         void* pStream = (void*)GCHandle::ToIntPtr(_gcHandle);&lt;br /&gt;&lt;br /&gt;         _mod = FMUSIC_LoadSong((char*)pStream, NULL);&lt;br /&gt;         FMUSIC_PlaySong(_mod);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     void StopPlay()&lt;br /&gt;     {&lt;br /&gt;         if (_mod)&lt;br /&gt;         {&lt;br /&gt;             FMUSIC_FreeSong(_mod);&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         if (_gcHandle.IsAllocated)&lt;br /&gt;         {&lt;br /&gt;             _gcHandle.Free();&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     ~ModPlayer()&lt;br /&gt;     {&lt;br /&gt;         StopPlay();&lt;br /&gt;     }&lt;br /&gt; };&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Обратите внимание на конструкцию вида:&lt;br /&gt;&lt;pre class="prettyprint"&gt;GCHandle _gcHandle = GCHandle::Alloc(_stream);&lt;br /&gt;void* pStream = (void*)GCHandle::ToIntPtr(_gcHandle);&lt;br /&gt;&lt;br /&gt;_mod = FMUSIC_LoadSong((char*)pStream, NULL);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Сдесь мне пришел в голову один хак. Поскольку ответственность по реализации callback-функций я взял на себя, то я могу совершенно спокойно передавать что угодно.&lt;br /&gt;&lt;br /&gt;Таким образом, я сделал фиксацию объекта Stream, получил на него неуправляемый указатель, привел его к типу который от меня хотели и передал в библиотечную функцию.&lt;br /&gt;&lt;br /&gt;Реализация callback-функций выглядит следующим образом:&lt;br /&gt;&lt;pre class="prettyprint"&gt;Stream^ handleToStream(unsigned int handle)&lt;br /&gt;{&lt;br /&gt; GCHandle gcHandle = GCHandle::FromIntPtr((IntPtr)(void*)handle);&lt;br /&gt; Stream^ stream = (Stream^)gcHandle.Target;&lt;br /&gt; return stream;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unsigned int memopen(char* instance)&lt;br /&gt;{&lt;br /&gt; return (unsigned int)((void*)instance);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void memclose(unsigned int)&lt;br /&gt;{&lt;br /&gt; // Do nothing because GC will free all allocated memory&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int memread(void *buffer, int size, unsigned int handle)&lt;br /&gt;{&lt;br /&gt; Stream^ stream = handleToStream(handle);&lt;br /&gt;&lt;br /&gt; if (stream-&gt;Position + size &gt;= stream-&gt;Length)&lt;br /&gt; {&lt;br /&gt;     size = (int)(stream-&gt;Length - stream-&gt;Position);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; array&lt;unsigned char=""&gt;^ managedBuffer = gcnew array&lt;unsigned char=""&gt;(&lt;br /&gt;     (unsigned int)size);&lt;br /&gt;&lt;br /&gt; stream-&gt;Read(managedBuffer, 0, size);&lt;br /&gt;&lt;br /&gt; Marshal::Copy(managedBuffer, 0, (IntPtr)buffer, managedBuffer-&gt;Length);&lt;br /&gt;&lt;br /&gt; return size;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void memseek(unsigned int handle, int pos, signed char mode)&lt;br /&gt;{&lt;br /&gt; Stream^ stream = handleToStream(handle);&lt;br /&gt;&lt;br /&gt; if (mode == SEEK_SET)&lt;br /&gt; {&lt;br /&gt;     stream-&gt;Position = pos;&lt;br /&gt; }&lt;br /&gt; else if (mode == SEEK_CUR)&lt;br /&gt; {&lt;br /&gt;     stream-&gt;Position += pos;&lt;br /&gt; }&lt;br /&gt; else if (mode == SEEK_END)&lt;br /&gt; {&lt;br /&gt;     stream-&gt;Position = stream-&gt;Length + pos;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (stream-&gt;Position &gt; stream-&gt;Length)&lt;br /&gt; {&lt;br /&gt;     stream-&gt;Position = stream-&gt;Length;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int memtell(unsigned int handle)&lt;br /&gt;{&lt;br /&gt; Stream^ stream = handleToStream(handle);&lt;br /&gt;&lt;br /&gt; return (int)stream-&gt;Position;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В фунции memopen вроде бы передают указатель на строку, но мы то знаем, что мы туда отдали ;)&lt;br /&gt;&lt;br /&gt;В принципе реализация остальных функций не требует особых пояснений.&lt;br /&gt;&lt;br /&gt;Так что теперь любой .NET программист сможет спокойно использовать эту библиотеку, потому как в его распоряжении окажется обычная .NET сборка с классом ModPlayer.&lt;br /&gt;&lt;br /&gt;Вот например я этот класс использовал в Windows Form приложении:&lt;br /&gt;&lt;pre class="prettyprint"&gt;namespace NMiniFMOD.Sample&lt;br /&gt;{&lt;br /&gt; public partial class FormMain : Form&lt;br /&gt; {&lt;br /&gt;     ModPlayer _modPlayer;&lt;br /&gt;&lt;br /&gt;     public FormMain()&lt;br /&gt;     {&lt;br /&gt;         InitializeComponent();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     private void FormMain_Shown(object sender, EventArgs e)&lt;br /&gt;     {&lt;br /&gt;         using (Stream stream = new MemoryStream(Resources.MusicTrack))&lt;br /&gt;         {&lt;br /&gt;             _modPlayer = new ModPlayer(stream);&lt;br /&gt;             _modPlayer.BeginPlay();&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     private void FormMain_FormClosing(object sender, FormClosingEventArgs e)&lt;br /&gt;     {&lt;br /&gt;         _modPlayer.Dispose();&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если интересно, могу выложить полный исходный код.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-5606056107154534552?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/5606056107154534552/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=5606056107154534552' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5606056107154534552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/5606056107154534552'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/07/managed-c.html' title='Managed C++. Проба пера'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4544854077309583198</id><published>2007-07-04T06:18:00.001-07:00</published><updated>2007-07-04T06:18:38.749-07:00</updated><title type='text'>Браузерная головная боль</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Сегодня обнаружил, что IE6 и, что более удручающее, IE7 содержат аналогичные проблемы с закачкой файлов по HTTP.&lt;br/&gt;&lt;br/&gt;Дело в том, что при попытке выкачать файл очень большого размера, скажем более 4,5 Гб, Internet Explorer испытывает арифметические переполнение из-за того, что пришедший Content-Length превышает максимальный размер 4-х байтового беззнакового целого числа (unsigned int). &lt;br/&gt;&lt;br/&gt;Причем если IE6 выдает "левые" размеры о скачиваемом файле и продолжает его качать, то IE7 уведомляет нас о том, что страница не может быть отображена. К сожалению попыток выкачать этот огромный файл с помощью IE6 не было времени ни желания :)&lt;br/&gt;&lt;br/&gt;Аналогичные опыты были проведены с Opera 8.5 - результат аналогичен IE6. К счастью Opera 9.21 никаких проблем в связи с этим не испытывает.&lt;br/&gt;&lt;br/&gt;Ну и самое главное это то, что Mozilla Firefox 1.5 и 2.0 работают так, как должен работать самый лучший браузер в мире :)&lt;br/&gt;&lt;br/&gt;И при этом не следует забывать, что Mozilla Firefox 1.5 является достаточно старой версией браузера.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4544854077309583198?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4544854077309583198/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4544854077309583198' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4544854077309583198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4544854077309583198'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/07/blog-post.html' title='Браузерная головная боль'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3021157713566607600</id><published>2007-06-29T11:20:00.000-07:00</published><updated>2007-06-29T11:34:27.784-07:00</updated><title type='text'>Дискуссия Java VS .NET</title><content type='html'>Не могу сказать что я обожаю holy wars, но сам лично стараюсь в них не ввязываться.&lt;br /&gt;Сегодня у меня состоялась дискуссия по ICQ с одним моим знакомым, и я, с его позволения, решил опубликовать наш диалог.&lt;br /&gt;&lt;br /&gt;Будем надеяться, что кому-то это покажется познавательным.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Ты можешь в двух словах обрисовать отличие Явы от Шарпа?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus:&lt;/span&gt; Могу&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Java - это консервативная выжимка из C++. Выкинули все редко используемое, которое только добавляло головную боль программистам. Язык реально кроссплатформенный это большой плюс. Язык открыли по лицензии GPL, поэтому это только пойдет ему на пользу, его буду портировать и дальше. Основная GUI библиотека  - Swing - выглядит как не родная под целевой OC.&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Есть еще либа SWT - приложения выглядят как родные на Windows, Mac OS, Linux&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Есть Java Community Process - это группа по развтию технологий языка. Одновременно хорошо и плохо. Хорошо, потому что язык будет более стабильным, не будут прикручивать сомнительные фичи, которые "перегрузят" язык. Плохо, потому что добавляет инертность к введению новых языковых конструкций.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt; эм, ну а указателей ведь там нет, и есть GC, как в Шарпе? а нотация венгерская, как в Си?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; C# основной язык платформы .NET&lt;br /&gt;Таким образом, зная Framework Class Library можно писать на любом языке. Сейчас реально можно писать на C#, Visual Basic .NET, Iron Python и это огромный плюс.&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Говорят что .NET вроде как тоже кроссплатформенный, но реально пока нет.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;А это, Mono?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Есть разработка в виде Mono, но нужно прилагать усилия, чтобы приложение везде работало.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt; а, даже так...&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Уже в версии 2.0 C# начал "обрастать" сомнительными, на мой взгляд, возможностями.&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Мне очень не нравится Nullable типы. Я считаю что это лишнее. &lt;span style="font-weight: bold;color:blue;" &gt; &lt;/span&gt; Это моя точка зрения.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Так это для баз данных, имхо&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt;Указателей в C# нет. GC есть. Соответственно, код стабилен и управляем.&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; да для баз.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Тем не менее, Ява умирает. Почему?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt;Ха. Пошутил :)&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Чем Шарп её обскакал?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus:&lt;/span&gt; Java никогда не умрет ;)&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Ну эта... на твоей фирме 2 года назад на Яве было 20% проектов, сейчас - меньше 5% ;)&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; .NET ее обскакал кроссязыковостью, пиаром, а также тем, что в Microsoft к разработчикам относятся лучше, чем наверное к пользвователям ;)&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Хе... &lt;span style="font-weight: bold;color:red;" &gt;&lt;/span&gt;Как по мне, так для программирования в среде .NET во сто крат лучше использовать шарп, а не что-либо иное&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt;Э тут ты не прав.&lt;span style="font-weight: bold;color:blue;" &gt;&lt;/span&gt; Не всегда C# тебе подойдет.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;А когда не подойдёт? Когда в большом тиме и не с нуля пишешь?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Мне как-то пришлось использовать язык IronPython - это реализация языка Python под платформу .NET. Есть Windows Service который в зависимости от пришедших данных поднимает ту или иную Assembly, в которой есть реализация некоторого интерфейса. Так вот фабричный метод реализован на языке IronPython. Таким образом, мы можем позволить Deployment новой компоненты без останова сервиса, наживую.&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; Достаточно выложить новую Assembly и новый скрипт с фабричным методом.&lt;br /&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий:&lt;/span&gt;Мммм, не понял... Это только IronPython позволяет? Помимо возможностей CLR?&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;status_alexus: &lt;/span&gt; IronPython это язык интерпретируемый. А C# копилируется в MSIL&lt;br /&gt;&lt;span style="font-weight: bold;color:blue;" &gt;&lt;/span&gt;&lt;span style="font-weight: bold;color:red;" &gt;Дмитрий: &lt;/span&gt;Оригинально... Я-то думал, что все языки на платформе .NET компилируются в MSIL&lt;br /&gt;&lt;br /&gt;Большое спасибо Дмитрию за поставленные вопросы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3021157713566607600?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3021157713566607600/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3021157713566607600' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3021157713566607600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3021157713566607600'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/06/java-vs-net.html' title='Дискуссия Java VS .NET'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-618563441797910321</id><published>2007-06-24T16:56:00.000-07:00</published><updated>2008-12-11T19:54:24.933-08:00</updated><title type='text'>Eclipse CDT</title><content type='html'>На выходных, я как обычно занимаюсь всякими бесполезностями :)&lt;br /&gt;&lt;br /&gt;Вот решил тряхнуть стариной и поковырять немного Eclipse как среду разработки для языка C++.&lt;br /&gt;&lt;br /&gt;Нашел достаточно внятную &lt;a href="http://yongshin.blogspot.com/2005/11/how-to-use-cdt-and-mingw-for-eclipse.html"&gt;заметку&lt;/a&gt;, как эту штуку можно настроить вместе с компилятором &lt;a href="http://ru.wikipedia.org/wiki/MinGW"&gt;MinGW&lt;/a&gt;. К сожалению, я решил съэкономить на трафике и воспользовался достаточно устаревшей MinGW версии 3.0.8.&lt;br /&gt;&lt;br /&gt;В качестве полигона для тестирования я взял свой старый проект &lt;a href="http://diyan.bagov.net/project.aspx?gruz2"&gt;Gruz2&lt;/a&gt;. Это небольшая игрулька, написаная на C++ и имеет зависимость на библиотеку SDL. Еще несколько лет назад я добился, чтобы она собиралась на Visual C++ 7, Borland C++ Builder 5 и MinGW 3.0.8 (из-под среды Dev-C++) и GCC 3.x под Mandriva Linux 10.1.&lt;br /&gt;&lt;br /&gt;Поэтому эксперимент можно назвать достаточно прозрачным. Все проблемы автоматически были списаны на настройку окружения ну и, естественно, на мои руки.&lt;br /&gt;&lt;br /&gt;К сожалению мне так и не удалось осилить настройку линковщика, и рабочей версии приложения так и не получилось :(&lt;br /&gt;&lt;br /&gt;Я уже было совсем расстроился от того, что мне ничего большего чем Hello World не удалось выжать, однако я вспомнил еще об одном моем древнем поделии под названием SmallBasic.&lt;br /&gt;&lt;br /&gt;Это реализация интерпретатора подмножества языка Basic. Главная его "фишка" заключалась в том, что он имел зависимости только на C++ Standard Template Library и при этом  тянул на аж 4 класса из 1363 строк :)&lt;br /&gt;&lt;br /&gt;Простите за такие жуткие цифры, этот проект был наколбашен достаточно давно.&lt;br /&gt;&lt;br /&gt;Вот как раз этот проект успешно собрался и даже удалось его немного подебажить.&lt;br /&gt;&lt;br /&gt;В целом впечатления довольно положительные. Жалко только что MinGW - самый "медленный" C++ компилятор в мире :) Ну уж очень долго он собирает проект.&lt;br /&gt;&lt;br /&gt;Вот такие фичи у CDT попали под угол моего зрения:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;подсветка синтаксиса&lt;/li&gt;&lt;li&gt;code complete&lt;/li&gt;&lt;li&gt;outline полей и функций активного *.cpp или *.h файла&lt;/li&gt;&lt;li&gt;вкладки c открытыми файлами&lt;/li&gt;&lt;li&gt;список задач (TODO, предупреждения, ошибки)&lt;/li&gt;&lt;li&gt;console output во вкладке&lt;/li&gt;&lt;li&gt;подсветка ошибок и предупреждений (насколько я понял поддерживается парсинг GCC/MinGW и Visual C++)&lt;/li&gt;&lt;li&gt;поддержка нескольких targets (типа можно настроить на сборку под GCC, MinGW, Visual C++ 7, Borland C++ да еще и под разными ОСями что бы скучно не было)&lt;/li&gt;&lt;li&gt;дебагер с показом переменных области видимости и Expression (это типа Watch в Visual Studio)&lt;/li&gt;&lt;li&gt;генератор makefile для MinGW и GCC&lt;/li&gt;&lt;li&gt;парсер makefile (outline подсветка синтаксиса и т.п.)&lt;/li&gt;&lt;/ul&gt;И обязательно, документальное подтверждение моих мук:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_njaJts9FAds/Rn8E4axHoZI/AAAAAAAAAA8/6KL-G8JaYbc/s1600-h/2007-06-26_025557.png"&gt;&lt;img src="http://2.bp.blogspot.com/_njaJts9FAds/Rn8E4axHoZI/AAAAAAAAAA8/6KL-G8JaYbc/s400/2007-06-26_025557.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_njaJts9FAds/Rn8E4axHoZI/AAAAAAAAAA8/6KL-G8JaYbc/s400/2007-06-26_025557.png" alt="" id="BLOGGER_PHOTO_ID_5079784272001737106" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-618563441797910321?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/618563441797910321/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=618563441797910321' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/618563441797910321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/618563441797910321'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/06/eclipse-cdt.html' title='Eclipse CDT'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_njaJts9FAds/Rn8E4axHoZI/AAAAAAAAAA8/6KL-G8JaYbc/s72-c/2007-06-26_025557.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1245397473198423790</id><published>2007-06-24T10:17:00.000-07:00</published><updated>2008-12-11T19:54:25.179-08:00</updated><title type='text'>Аудиопроигрыватель для Linux</title><content type='html'>Сегодня у меня был очень приятный опыт использования сразу двух программ в Linux. :)&lt;br /&gt;&lt;br /&gt;Первая это Exaile - аудиплеер. Достаточно продуманный интерфейс. Функционально программа, в некоторой степени, напоминает iTunes, однако не обременена такими вещами как интерфейс для покупки песен через интернет.&lt;br /&gt;Очень удобный, на мой взгляд, фичер - боковая панель с деревом, контекст которого можно менять. Т.е. вы можете в дереве группировать аудиозаписи по исполнителю, альбому или жанру.&lt;br /&gt;Кроме того, все плейлисты отображаются как табуляторы, таким образом у меня под рукой интерфейс ко всей моей аудиотеке.&lt;br /&gt;&lt;br /&gt;Самой большой для меня проблемой оказалось невозможность назначать глобальные горячие клавиши на управление плеером. Лично для меня это очень важно, так как я ценю свое время ;)&lt;br /&gt;&lt;br /&gt;В общем я, как пользователь достаточно нетривиального Windows-плеера Foobar2000, был очень доволен этим линуховым зверем.&lt;br /&gt;&lt;br /&gt;Второй проблемой этого плеера стало отсутствие нормальной поддержки кирилицы в ID3 тегах версии 1. Как многие знают, большинство MP3 файлов имеют теги, которые сохранены в кодировке Windows-1251. А вот в Linux большинство софта по понятным причинам не любит эту кодировку.&lt;br /&gt;&lt;br /&gt;Поэтому вторая программа - EasyTAG была ключиком к решению этой проблемы.&lt;br /&gt;&lt;br /&gt;Скажу прямо, что такого продвинутого софта для обработки тегов я не видел даже под Windows. Хотя, возможно, подобный софт прошел мимо моего поля зрения, т.к. я ну очень редко занимаюсь обработкой тегов.&lt;br /&gt;&lt;br /&gt;Правда интерфейс у этой программы не такой уж и интуитивный. Не знаю точно как нужно было авторам реализовывать пользовательский интерфейс, но вот он мне показался немного неудобным и все тут :)&lt;br /&gt;&lt;br /&gt;Для решения проблемы с кодировками я настроил эту программу чтобы она читала все ID3 теги в кодировке Windows-1251, и принудительно записывала их в Unicode (UTF-8). Кроме того, я был вынужден запретить сохранение ID3 тегов версии 1, т.к. он не поддерживает многобайтовых кодировок.&lt;br /&gt;&lt;br /&gt;После этого я выбрал все "проблемные" файлы с сказал программе, чтобы она принудительно перезаписала в них теги.&lt;br /&gt;&lt;br /&gt;Еще одной очень полезной особенностью программы EasyTAG является то, что уровень ее подсказок об той или иной настройке представляет из себя компактную энциклопедию по обработке ID3 тегов :)&lt;br /&gt;&lt;br /&gt;В общем ОС Linux постепенно "обрастает" действительно классным софтом. Так что даже .NET программист не гнушается этой интересной операционкой ;)&lt;br /&gt;&lt;br /&gt;Скриншоты прилагаются:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_njaJts9FAds/Rn6oqKxHoXI/AAAAAAAAAAs/urY6CCCn86c/s1600-h/Exaline.png"&gt;&lt;img fix="tofix" src="http://4.bp.blogspot.com/_njaJts9FAds/Rn6oqKxHoXI/AAAAAAAAAAs/urY6CCCn86c/s400/Exaline.png" fix="tofix" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_njaJts9FAds/Rn6oqKxHoXI/AAAAAAAAAAs/urY6CCCn86c/s400/Exaline.png" alt="" id="BLOGGER_PHOTO_ID_5079682872118845810" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_njaJts9FAds/Rn6o1KxHoYI/AAAAAAAAAA0/pCDm_Zef2Dg/s1600-h/EasyTAG.png"&gt;&lt;img fix="tofix" src="http://4.bp.blogspot.com/_njaJts9FAds/Rn6o1KxHoYI/AAAAAAAAAA0/pCDm_Zef2Dg/s400/EasyTAG.png" fix="tofix" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_njaJts9FAds/Rn6o1KxHoYI/AAAAAAAAAA0/pCDm_Zef2Dg/s400/EasyTAG.png" alt="" id="BLOGGER_PHOTO_ID_5079683061097406850" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1245397473198423790?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1245397473198423790/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1245397473198423790' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1245397473198423790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1245397473198423790'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/06/linux.html' title='Аудиопроигрыватель для Linux'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_njaJts9FAds/Rn6oqKxHoXI/AAAAAAAAAAs/urY6CCCn86c/s72-c/Exaline.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1702902093469505601</id><published>2007-06-17T12:45:00.001-07:00</published><updated>2007-06-17T12:45:50.185-07:00</updated><title type='text'>Кому нужен WinRAR?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Сегодня в очередной раз порадовался своему основному архиватору.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Последний год, или может быть два, я использую архиватор &lt;a href='http://www.7-zip.org/ru/'&gt;7-Zip&lt;/a&gt;. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Во-первых, алгоритм упаковки LZMA который лег в основу формата 7z дает просто потрясающую степень сжатия. Правда платить за это придется высокоми требования на распаковку, и, особенно, на упаковку. Однако, в настоящее время это не является большой проблемой. И самое главное, что этот формат лицензирован по GNU LGPL, что дает вам полное право использовать этот формат где вам угодно. И как закономерность данного лицензирования - кроссплатформенность.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Сегодня нужно было упаковать игру Quake 2 (ну нужна она мне и все тут :) ), так я был просто поражен результатом.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Оригинальный размер дистрибутива был 210 Мб, который после упаковки превратился в ничтожные 79 Мб. Фантастика, не правда ли ;)&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Особенно если учесть что ребята из ID Software молодцы. Они все игровые данные упаковывают в один файл pak.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Правда ложкой дегтя можно назвать требования по ОЗУ для работы с архивами в режиме ультра сжатия: для упаковки требуется 709 Мб, а для распаковки - 66 Мб.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Но согласитесь, на то он и архив. Чтобы хорошенько упаковать и записать на диск.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1702902093469505601?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1702902093469505601/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1702902093469505601' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1702902093469505601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1702902093469505601'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/06/winrar.html' title='Кому нужен WinRAR?'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8910419394349233468</id><published>2007-06-09T06:21:00.001-07:00</published><updated>2007-06-09T06:21:13.332-07:00</updated><title type='text'>Тестовый пост</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Прошу прощения за "левый" пост, просто проверяю работу плагина для Firefox&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8910419394349233468?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8910419394349233468/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8910419394349233468' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8910419394349233468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8910419394349233468'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/06/blog-post.html' title='Тестовый пост'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8221672524345600620</id><published>2007-05-24T14:19:00.000-07:00</published><updated>2007-05-24T14:21:46.166-07:00</updated><title type='text'>Очень занятные шутки про блондинок</title><content type='html'>Недавно &lt;a href="http://gluek.info/2004/12/06/pro-blondinok/"&gt;нашел&lt;/a&gt; очень прикольные шутки про блондинок.&lt;br /&gt;&lt;br /&gt;По правде говоря, даже не ожидал, что можно так действительно интересно шутить.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8221672524345600620?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8221672524345600620/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8221672524345600620' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8221672524345600620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8221672524345600620'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/blog-post_24.html' title='Очень занятные шутки про блондинок'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3148097397000356079</id><published>2007-05-19T09:53:00.000-07:00</published><updated>2007-07-18T07:12:19.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Reader'/><category scheme='http://www.blogger.com/atom/ns#' term='Чтение новостей'/><title type='text'>Инструкция по использованию Google Reader</title><content type='html'>Вопрос: Как быть в курсе всех интересующих событий?&lt;br /&gt;Ответ: Быть подписанным и читать новостные ленты&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вопрос: Что такое новостные ленты?&lt;br /&gt;Ответ: Есть например три сайта - sport.ru, job.ru и hobby.ru и вам интересно чего там новенького появляется. В этом случае существует два варианта.&lt;br /&gt;&lt;br /&gt;Bариант первый. C упорством дебила заходить один раз в несколько дней (неделю/месяц/год) на каждый из этих сайтов и проверять не появились ли новые новости/статьи/заметки, после чего их читать. При этом щедро одаривать любимого провайдера бесполезно израсходованным трафиком...&lt;br /&gt;&lt;br /&gt;Вариант второй. Использовать ленты новостей. С их помощью новую информацию можно получать в виде определенных данных, которые обрабатывают специальные программы для чтения новостных лент. Из называют RSS-читателями. Таким образом, информация из нескольких ресурсов стекается к одному-единственному месту.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вопрос: С помощью чего читать эти новостные ленты?&lt;br /&gt;Ответ: Использовать Google Reader&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Google Reader можно пользоваться следующим образом:&lt;br /&gt;- зайти на сайт, новости которого, вас интересуют&lt;br /&gt;- в адресной строке браузера должен появиться значек, который сигнализирует о том, что сайт поддерживает публикацию новостных лент в форматах RSS или Atom (Atom это более новый формат, желательно подписываться именно на него)&lt;br /&gt;- скопировать ссылку на новостную ленту в буфер обмена&lt;br /&gt;- зайти на http://www.google.com/reader&lt;br /&gt;- залогиниться&lt;br /&gt;- сделать клик на ссылке "Add subscription" и в появившемся окошке ввести url который был скопирован в буфер обмена&lt;br /&gt;- щелкнуть на "Add"&lt;br /&gt;&lt;br /&gt;UPD: сразу после того, как я опубликовал это сообщение, мне стало интересно, а был ли вообще смысл в подобной инструкции :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3148097397000356079?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3148097397000356079/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3148097397000356079' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3148097397000356079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3148097397000356079'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/google-reader.html' title='Инструкция по использованию Google Reader'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4894822049120410883</id><published>2007-05-19T09:44:00.000-07:00</published><updated>2007-05-19T09:47:15.044-07:00</updated><title type='text'>Мой Firefox</title><content type='html'>&lt;span class="GeneratedHeader"&gt;Вот такой винегрет по мотивам Firefox я использую на работе и дома.&lt;br /&gt;&lt;br /&gt;Generated:&lt;/span&gt; Sun May 20 2007 19:42:29  GMT+0300&lt;br /&gt;&lt;span class="UserAgentHeader"&gt;User Agent:&lt;/span&gt; Mozilla/5.0 (Windows;  U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1&lt;br /&gt;&lt;span class="BuildIDHeader"&gt;Build ID:&lt;/span&gt; 2006120418&lt;br /&gt;&lt;br /&gt;&lt;span class="ExtensionHeader"&gt;Enabled Extensions:&lt;/span&gt; [20] &lt;ul&gt;&lt;li&gt;&lt;a href="http://adblockplus.org/" target="_blank"&gt;Adblock Plus&lt;/a&gt; 0.7.2.4  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.customizegoogle.com/" target="_blank"&gt;CustomizeGoogle&lt;/a&gt;  0.55  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mozilla.org/projects/inspector/" target="_blank"&gt;DOM  Inspector&lt;/a&gt; 1.8.1.1  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.getfirebug.com/" target="_blank"&gt;Firebug&lt;/a&gt; 1.0  &lt;/li&gt;&lt;li&gt;&lt;a href="http://forums.mozillazine.org/viewtopic.php?t=370248" target="_blank"&gt;Fission&lt;/a&gt; 0.8.7  &lt;/li&gt;&lt;li&gt;&lt;a href="http://flashgot.net/" target="_blank"&gt;FlashGot&lt;/a&gt; 0.5.97.03  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/tools/firefox/browsersync/" target="_blank"&gt;Google Browser Sync&lt;/a&gt; 1.3.20061031.0  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/search?q=Firefox%20Human%20URL" target="_blank"&gt;Human URL&lt;/a&gt; 0.1.2.2  &lt;/li&gt;&lt;li&gt;&lt;a href="http://ietab.mozdev.org/" target="_blank"&gt;IE Tab&lt;/a&gt; 1.3.1.20070126  &lt;/li&gt;&lt;li&gt;&lt;a href="http://imglikeopera.mozdev.org/" target="_blank"&gt;ImgLikeOpera&lt;/a&gt;  0.6.15  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hacksrus.com/%7Eginda/venkman/" target="_blank"&gt;JavaScript  Debugger&lt;/a&gt; 0.9.87  &lt;/li&gt;&lt;li&gt;&lt;a href="http://menueditor.mozdev.org/" target="_blank"&gt;Menu Editor&lt;/a&gt; 1.2.3  &lt;/li&gt;&lt;li&gt;&lt;a href="http://mozilla.dorando.at/" target="_blank"&gt;MenuManipulator&lt;/a&gt;  20060418.1.1  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mrtech.com/extensions/local_install/" target="_blank"&gt;MR  Tech Local Install&lt;/a&gt; 5.3.2.3  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pdfdownload.org/" target="_blank"&gt;PDF Download&lt;/a&gt; 0.7.9  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/search?q=Firefox%20Russian%20spellchecking%20dictionary" target="_blank"&gt;Russian spellchecking dictionary&lt;/a&gt; 0.2  &lt;/li&gt;&lt;li&gt;&lt;a href="http://amb.vis.ne.jp/mozilla/scrapbook/" target="_blank"&gt;ScrapBook&lt;/a&gt; 1.2.0.8  &lt;/li&gt;&lt;li&gt;&lt;a href="http://chrispederick.com/work/webdeveloper/" target="_blank"&gt;Web  Developer&lt;/a&gt; 1.1.2 &lt;/li&gt;&lt;/ul&gt;&lt;span class="ExtensionDisabledHeader"&gt;&lt;/span&gt;&lt;span class="ExtensionHeader"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="ThemeHeader"&gt;Installed Themes:&lt;/span&gt; [4] &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mozilla.org/" target="_blank"&gt;Firefox (default)&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.tom-cat.com/mozilla" target="_blank"&gt;Mostly Crystal&lt;/a&gt;  2.0.0.16&lt;/b&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://kasteo.deviantart.com/" target="_blank"&gt;Noia 2.0 (eXtreme)&lt;/a&gt;  3.371  &lt;/li&gt;&lt;li&gt;&lt;a href="http://sa-ki.deviantart.com/" target="_blank"&gt;nuoveXT-Firefox_1.5&lt;/a&gt;  1.5 &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="PluginHeader"&gt;Installed Plugins:&lt;/span&gt; (8) &lt;ul&gt;&lt;li&gt;Adobe Acrobat  &lt;/li&gt;&lt;li&gt;Java(TM) Platform SE 6  &lt;/li&gt;&lt;li&gt;LogMeIn Inc. Remote Access Components 1.0.0.242  &lt;/li&gt;&lt;li&gt;Microsoft® DRM  &lt;/li&gt;&lt;li&gt;Mozilla Default Plug-in  &lt;/li&gt;&lt;li&gt;PCMan's IE Tab Plug-in for Mozilla/Firefox  &lt;/li&gt;&lt;li&gt;QuickTime Plug-in 6.5.1  &lt;/li&gt;&lt;li&gt;Windows Media Player Plug-in Dynamic Link Library &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4894822049120410883?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4894822049120410883/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4894822049120410883' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4894822049120410883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4894822049120410883'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/firefox.html' title='Мой Firefox'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3429104252384876343</id><published>2007-05-19T08:11:00.000-07:00</published><updated>2007-05-19T09:01:12.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='Miranda'/><title type='text'>В поисках святого грааля</title><content type='html'>Сегодня вдруг захотелось отыскать plugin для Miranda, который добавляет проверку правописания в сообщениях. Спустя получасового сеанса нашел то что мне было нужно и то, что мне не было нужно :)&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-weight: normal;"&gt;Нашел русскую &lt;a href="http://www.habrahabr.ru/blog/miranda/11089.html"&gt;инструкцию &lt;/a&gt;по установке этого плагина.&lt;br /&gt;Вот еще одна &lt;a href="http://new.lemnews.com/forum/viewtopic.php?t=1819&amp;start=90&amp;amp;postdays=0&amp;postorder=asc&amp;amp;highlight=&amp;sid=138d2eaeca369d944fb90137c3e30d9e"&gt;инструкция&lt;/a&gt; на русском языке.&lt;br /&gt;Официальный &lt;a href="http://pescuma.mirandaim.ru/miranda/spellchecker"&gt;сайт&lt;/a&gt; на английском языке. Я использовал именно "официальную" инструкцию.&lt;br /&gt;Для тех, кто хочет быть на гребне волны, может наблюдать за дискуссией в &lt;a href="http://forums.miranda-im.org/showthread.php?t=11555"&gt;ветке&lt;/a&gt; на официальном форуме&lt;/strong&gt; программы Miranda.&lt;br /&gt;&lt;br /&gt;Проверка орфографии проводится не с помощью Aspell, как я предполагал, а с помощью движка, который использует OpenOffice.org&lt;br /&gt;&lt;br /&gt;Меня в очередной раз порадовала идеология Open Source, которая проявляется в законе "на плечах гигантов".  Любой разработчик может использовать готовое решение, причем переносимость этого решения не вызывает у меня никаких сомнений.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Так что попробую использовать этот plugin некоторое время. Думаю что он у меня приживется :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Кроме того, обнаружил еще два любопытных плагина:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="fileNameHeader"&gt;&lt;a href="http://addons.miranda-im.org/details.php?action=viewfile&amp;id=3026"&gt;Miranda-GDS-V2&lt;/a&gt; - обеспечит интеграцию Google Desktop Search с историей сообщений, которая хранится в базе Miranda. Не знаю насколько он будет мне полезен, так как я не использую дома &lt;/span&gt;&lt;span class="fileNameHeader"&gt;Google Desktop Search. Для поиска сообщения по истории я использую &lt;/span&gt;&lt;a href="http://addons.miranda-im.org/details.php?action=viewfile&amp;amp;id=1365"&gt;&lt;span class="fileNameHeader"&gt;Find A Message&lt;/span&gt;&lt;/a&gt;&lt;span class="fileNameHeader"&gt;, хотя может быть мне стоит перестать жадничать и поставить у себя дома &lt;/span&gt;&lt;span class="fileNameHeader"&gt; Google Desktop Search :)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="fileNameHeader"&gt;&lt;a href="http://addons.miranda-im.org/details.php?action=viewfile&amp;id=2345"&gt;WATrack&lt;/a&gt; - Отображает название проигрываемой песни в окне сообщений. Поддерживает Winamp, Apollo,&lt;/span&gt; 1by1, Media Player Classic, Window Media Player, JetAudio и FooBar. ...уверенная победа в номинации "самый бесполезный plugin" ;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3429104252384876343?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3429104252384876343/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3429104252384876343' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3429104252384876343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3429104252384876343'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/blog-post.html' title='В поисках святого грааля'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8850479919247076668</id><published>2007-05-13T03:02:00.000-07:00</published><updated>2007-05-13T03:04:21.396-07:00</updated><title type='text'>Параметры командной строки в .NET Windows Forms</title><content type='html'>&lt;pre&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;Оказывается, что это можно получить предельно просто :)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;[] args = Environment.GetCommandLineArgs();&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8850479919247076668?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8850479919247076668/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8850479919247076668' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8850479919247076668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8850479919247076668'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/net-windows-forms.html' title='Параметры командной строки в .NET Windows Forms'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1637500348054178503</id><published>2007-05-07T12:19:00.000-07:00</published><updated>2007-05-08T11:41:07.018-07:00</updated><title type='text'>Анализ функциональности Firebird, MySQL, PostgreeSQL</title><content type='html'>Привожу текст одного из своих писем, которое я отправлял своему руководителю работы на бакалавриат. Заранее предупреждаю, что это мое частное, поверхностное мнение. Никаких тестов производительности, серьезных и глубоких исследований я не проводил. Вся последующая информация передается по принципу "все что было на поверхности моего взора" :)&lt;br /&gt;&lt;br /&gt;I. PostgreSQL 8.1.5&lt;br /&gt;&lt;br /&gt;Работает на Windows NT и на Win9x через Cygwin, Linux, FreeBSD, Mac OS X, Novell Netware 6, OS/2&lt;br /&gt;&lt;br /&gt;BSD лицензия, существует так же коммерческая лицензия (которая предполагает техническую поддержку)&lt;br /&gt;&lt;br /&gt;Поддерживает транзакции, подзапросы, триггеры, представления, внешние ключи, пользовательские типы и их наследование&lt;br /&gt;&lt;br /&gt;Исталлятор на русском языке.&lt;br /&gt;&lt;br /&gt;Поддержка языка запросов PL/pgSQL, который очень похож на PL/SQL Oracle.&lt;br /&gt;&lt;br /&gt;Поддержка хранимых процедур, написанных на PL/Java, PL-J, plPHP, plR, pl-ruby. Соответственно, хранимые процеруры можно писать на диалектах Java, PHP, Ruby (и каком-то языке для статистики - R).&lt;br /&gt;&lt;br /&gt;В пакете идет консольная и графическая консоль управления&lt;br /&gt;&lt;br /&gt;В пакете идет JDBC, Npgsql, ODBC, OLEDB драверы, таким образом обеспечивается функциональность для языков Java (JDBC), .NET (Npgsql), ADO (OleDB) и прочих через драйвер OBDC.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.postgresql.org/docs/faqs.FAQ.html"&gt;FAQ &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На официальном сайте я обнаружил очень подробную техническую документацию, в которой смог легко сориентироваться.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;II. Firebird&lt;br /&gt;&lt;br /&gt;Firebird - это СУБД InterBase, код которой открыла компания Borland&lt;br /&gt;&lt;br /&gt;Работает под Windows, Linux, Mac-OS (Darwin) и некоторых Unix платформах.&lt;br /&gt;&lt;br /&gt;Идет под лицензией MPL, с небольшими ограничениями.&lt;br /&gt;&lt;br /&gt;Инсталлятор на английском языке.&lt;br /&gt;&lt;br /&gt;Поддерживает транзакции, триггеры, хранимые процедуры.&lt;br /&gt;&lt;br /&gt;Функциональность СУБД аналогична InterBase.&lt;br /&gt;&lt;br /&gt;Официальный сайт мне вообще не понравился, информация слабо структурирована.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;III. MySQL&lt;br /&gt;&lt;br /&gt;Работает на Windows, Linux, Unix, MacOS&lt;br /&gt;&lt;br /&gt;Является наиболее известной открытой СУБД. Существует масса материалов на русском языке в виде печатных изданий и интернет ресурсов.&lt;br /&gt;&lt;br /&gt;В пакете идет только консольная утилита для администрирования.&lt;br /&gt;&lt;br /&gt;Инсталлятор на английском языке.&lt;br /&gt;&lt;br /&gt;Начиная с версии 5.0 начала поддерживать хранимые процедуры.&lt;br /&gt;&lt;br /&gt;Существуют провайдеры данных для Java, ADO.NET, ODBC, PHP, Perl и многих других языков.&lt;br /&gt;&lt;br /&gt;На официальном сайте обнаружил массу документации, однако организация сайта не очень понравилась.&lt;br /&gt;&lt;br /&gt;IV. &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems"&gt;Сравнение существующих СУБД&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://benchw.sourceforge.net/"&gt;Программа&lt;/a&gt; для тестирования производительности различных СУБД.&lt;br /&gt;&lt;br /&gt;Поддерживаются:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Postgresql&lt;/li&gt;&lt;li&gt;Mysql&lt;/li&gt;&lt;li&gt;DB2&lt;/li&gt;&lt;li&gt;Oracle&lt;/li&gt;&lt;li&gt;Sapdb&lt;/li&gt;&lt;li&gt;Firebird&lt;/li&gt;&lt;li&gt;Microsoft SQL Server&lt;/li&gt;&lt;li&gt;Sybase&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://benchw.sourceforge.net/benchw_results_open3.html"&gt;Результаты тестирования нескольких открытых СУБД&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;V. Личное мнение&lt;br /&gt;&lt;br /&gt;От себя еще добавлю, то, что я пробовал использовать Oracle, MS SQL Server и MySQL из-под .NET&lt;br /&gt;&lt;br /&gt;Лично мне диалект MySQL мне не очень понравился.&lt;br /&gt;&lt;br /&gt;Все три вышеперечисленных СУБД совершенно спокойно работают с Unicode, так что проблем с интернационализацией быть просто не может.&lt;br /&gt;&lt;br /&gt;Firebird предоставляет выбор запуска СУБД как приложение и как Windows служба. PostgreSQL работает только как сервис.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;В общем, думаю что имеет смысл попробовать PostgreSQL. Многие мои знакомые программисты рекомендовали использовать именно.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPD&lt;/span&gt;:&lt;br /&gt;Поступило логичное замечание о том, что функциональность Firebird недостаточно освещена. Я это сделал по причине того, что Firebird вырос из Interbase. Соответственно то, что эта СУБД является форком когда-то коммерческого движка говорит только в ее пользу.&lt;br /&gt;&lt;br /&gt;Для доступа к базе конечно же существует ODBC драйвер, .NET Data провайдер и  CA-JDBC (Jaybird) драйвер. Кстати, замечу, что OleDb драйвер не упоминался :)&lt;br /&gt;&lt;br /&gt;Сегодня обнаружил следующие, достаточно веские аргументы в пользу Firebird против &lt;a href="http://www.firebirdsql.org/dotnetfirebird/blog/2005/02/embedded-firebird-and-microsoft-sql.html"&gt;MS SQL Server&lt;/a&gt;, &lt;a href="http://www.firebirdsql.org/dotnetfirebird/blog/2005/03/firebird-advantages-over-postgresql.html"&gt;PostgreSql&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Из всех аргументов, честно говоря для меня наиболее существенным было наличие хорошего ADO.NET провайдера, который судя по заявлению разработчиков, поддерживает такие сервисные API как резвервное копирование и восстановление, статистика, пакетное выполение SQL скриптов.&lt;br /&gt;&lt;br /&gt;Однако, использование подобных вещей из-под .NET приложение мне кажется сомнительной пользой. На мой взгляд, подобные вещи должны выполняться несколько иными механизмами, находящимися за пределами .NET клиента СУБД.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1637500348054178503?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1637500348054178503/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1637500348054178503' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1637500348054178503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1637500348054178503'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/firebird-mysql-postgreesql.html' title='Анализ функциональности Firebird, MySQL, PostgreeSQL'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4244454158042370316</id><published>2007-05-07T12:02:00.000-07:00</published><updated>2007-05-07T12:06:23.089-07:00</updated><title type='text'>log4net в три шага</title><content type='html'>Сегодня решил воспользоваться библиотекой log4net для логирования сообщений в проекте, который я пишу в качестве работы на бакалавриат (слово "бакалавриат" мне подсказал spellchecker встроенный в Firefox, надеюсь что он меня не подвел :) ).&lt;br /&gt;&lt;br /&gt;После непродолжительного гугления я сделал следующее:&lt;br /&gt;&lt;br /&gt;1. Добавил ссылку на сборку log4net.dll в свой проект.&lt;br /&gt;2. В App.config файл добавил следующее:&lt;br /&gt;&lt;pre&gt;&amp;lt;configSections&amp;gt;&lt;br /&gt;&amp;lt;section name=&amp;quot;log4net&amp;quot; type=&amp;quot;System.Configuration.IgnoreSectionHandler&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/configSections&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;log4net&amp;gt;&lt;br /&gt;&amp;lt;appender name=&amp;quot;LogFileAppender&amp;quot; type=&amp;quot;log4net.Appender.RollingFileAppender&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;File&amp;quot; value=&amp;quot;log/trace.log&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;AppendToFile&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;RollingStyle&amp;quot; value=&amp;quot;Date&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;layout type=&amp;quot;log4net.Layout.PatternLayout&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%-5p %d{yyyy-MM-dd hh:mm:ss} [%t] %m%n&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/layout&amp;gt;&lt;br /&gt;&amp;lt;/appender&amp;gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;  &amp;lt;level value=&amp;quot;DEBUG&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;appender-ref ref=&amp;quot;LogFileAppender&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&amp;lt;/log4net&amp;gt;&lt;/pre&gt;&lt;br /&gt;3. В AssemblyInfo.cs добавил следующую строку:&lt;br /&gt;&lt;pre&gt;[assembly: log4net.Config.DOMConfigurator(Watch = true)]&lt;/pre&gt;&lt;br /&gt;4. И после этого смог воспользоваться логированием из своего кода следующим образом:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static class ApplicationEntryPoint&lt;br /&gt;{&lt;br /&gt; public static ILog log = LogManager.GetLogger(string.Empty);&lt;br /&gt;&lt;br /&gt; [STAThread]&lt;br /&gt; static void Main()&lt;br /&gt; {&lt;br /&gt;  log.Info("Application: start");&lt;br /&gt;  Application.EnableVisualStyles();&lt;br /&gt;  Application.SetCompatibleTextRenderingDefault(false);&lt;br /&gt;&lt;br /&gt;  FormMain formMain = new FormMain();&lt;br /&gt;  Application.Run(formMain);&lt;br /&gt;  log.Info("Application: end");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Таким образом, лог будет выглядеть следующим образом:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;INFO  2007-05-07 10:02:14 [1064] Application: start&lt;br /&gt;INFO  2007-05-07 10:02:17 [1064] Соединение с базой Paradox было успешно установлено.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4244454158042370316?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4244454158042370316/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4244454158042370316' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4244454158042370316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4244454158042370316'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/log4net_07.html' title='log4net в три шага'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8960798906898140458</id><published>2007-05-03T11:19:00.000-07:00</published><updated>2007-05-03T11:26:39.009-07:00</updated><title type='text'>Notepad++ 4.1 Released</title><content type='html'>Сегодня прочел новость о выходе новой версии моего любимого легковесного текстового редактора &lt;a href="http://sourceforge.net/forum/forum.php?forum_id=691679"&gt;Notepad++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Был очень приятно удивлен добавлением плагина SpellChecker, который работает на базе aspell. Нужно будет на досуге обязательно попробовать эту функциональность. Меня давно интересовал этот движек для проверки орфографии, однако я до сих пор не видел продукта под-Windows-для-людей, который бы его использовал (Vim и Emacs я считаю достаточно сложными в освоении).&lt;br /&gt;&lt;br /&gt;Вдруг вспомнилось о плагине для Miranda, который тоже, используя aspell, проверяет орфографию при наборе сообщения, который я так и не испытал до сих пор :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8960798906898140458?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8960798906898140458/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8960798906898140458' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8960798906898140458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8960798906898140458'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/05/notepad-41-released.html' title='Notepad++ 4.1 Released'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-3073200169094953791</id><published>2007-04-27T09:07:00.000-07:00</published><updated>2007-04-27T09:26:46.007-07:00</updated><title type='text'>Все гораздо сложнее, чем кажется</title><content type='html'>&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;Сегодня несколько часов потратил на решение проблемы, которую и решать-то не нужно было:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.id-as.com/arts/ala/slidingdoors2/"&gt;&lt;span style="font-weight: normal;"&gt;http://www.id-as.com/arts/ala/slidingdoors2/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;«Западание» в IE:&lt;/strong&gt; Если вы наблюдаете «западание» (исчезновение) фоновых изображений при наведении курсора на закладки в IE/Win, проверьте установки кэша для временных файлов (&lt;span style="font-size:100%;"&gt;&lt;code&gt;Сервис &gt; Свойства обозревателя &gt; Общие &gt; Настройка&lt;/code&gt;&lt;/span&gt;). Вы, возможно, поменяли установку по умолчанию, чтобы быть уверенным, что видите последнюю версию страницы при каждом ее обновлении. IE/Win имеет проблемы с отображением фоновых изображений для ссылок, если вы указали «При каждом посещении страницы». Установка по умолчанию «Автоматически». Она позволяет браузеру мгновенно получать изображение из кэша, предотвращая любые мигания. Большинство пользователей не меняют эту установку, скорее всего, они даже не знают о ее существовании.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-3073200169094953791?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/3073200169094953791/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=3073200169094953791' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3073200169094953791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/3073200169094953791'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/04/blog-post_27.html' title='Все гораздо сложнее, чем кажется'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-4517682162838762508</id><published>2007-04-20T14:01:00.000-07:00</published><updated>2007-04-20T14:06:53.115-07:00</updated><title type='text'>Google Talk - впустим прогресс в нашу жизнь</title><content type='html'>Основные плюсы:&lt;br /&gt;&lt;br /&gt;- основан на октрытом протоколе Jabber&lt;br /&gt;- для передачи текстовых сообщений существует просто уйма клиентов на просто уйме платформ&lt;br /&gt;- позволяет сохранять историю сообщений на сервере&lt;br /&gt;- официальный клиент никогда не будет перегружен рекламой, т.к. протокол открыт и ты можешь спокойно использовать прочие клиенты&lt;br /&gt;- никогда не будет проблем с альтернативными клиентами по причине открытой спецификации протокола&lt;br /&gt;- политика google заключается в многоплотформенности, мобильности и интеграции&lt;br /&gt;- поддерживает видео и аудио конференции&lt;br /&gt;- поддерживает линковку с другими jabber-серверами&lt;br /&gt;- дает самую достойную связь на dial-up линиях. Когда Skype рвет, Google Talk меняет компрессию так, что ты голос собеседника узнать вообщен не можешь (металлический голос), но слышишь его очень отчетливо&lt;br /&gt;- имеет два варианта Online клиента, что дает возможность чата из интернет-кафе&lt;br /&gt;&lt;br /&gt;Я, например, использую Google Talk протокол + Miranda клиент.&lt;br /&gt;В случае, если мне вдруг понадобиться голосовой чат - запускаю официальный клиент не закрывая Miranda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-4517682162838762508?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/4517682162838762508/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=4517682162838762508' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4517682162838762508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/4517682162838762508'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/04/google-talk.html' title='Google Talk - впустим прогресс в нашу жизнь'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-8435616677062527410</id><published>2007-04-20T09:28:00.000-07:00</published><updated>2007-04-25T06:36:28.421-07:00</updated><title type='text'>Как обуздать Windows Service</title><content type='html'>По своей работе частенько приходиться ковыряться с самописными Windows Service на удаленных машинах.&lt;br /&gt;&lt;br /&gt;Можно достаточно быстро и удобно это делать из командной строки:&lt;br /&gt;Посмотреть статус сервиса    -    sc query &lt;имя сервися&gt;&lt;br /&gt;Запустить сервис -    net start &lt;имя сервиса&gt;&lt;br /&gt;Остановить сервис - net stop &lt;имя сервиса&gt;&lt;br /&gt;&lt;br /&gt;Есть так же возможность делать запуск/останов сервиса командами sc start &lt;имя сервиса&gt; и sc stop &lt;имя сервиса&gt;, но при этом команда отправляет сигнал сервису и сразу же возвращает управление консоли.&lt;br /&gt;&lt;br /&gt;Мне лично такой вариант меньше подходит, потому как меня интересует синхронная команда. В случае с net start и net stop я вижу сколько приблизительно времени занимает операция запуска и останова сервиса и сразу же смогу обратить внимание на случаи, когда подобные операции с сервисом заканчиваются неудачей.&lt;br /&gt;&lt;br /&gt;Можно так же удобно управлять удаленными Windows службами при наличии необходимых прав:&lt;br /&gt;sc &lt;имя компьютера&gt; &lt;команда&gt; &lt;имя сервиса&gt;&lt;br /&gt;&lt;br /&gt;Например мы хотим узнать статус службы dhcp (это служба "DHCP клиент") на компьютере с сетевым именем notebook :)&lt;br /&gt;sc \\notebook query dhcp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-8435616677062527410?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/8435616677062527410/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=8435616677062527410' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8435616677062527410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/8435616677062527410'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/04/windows-service.html' title='Как обуздать Windows Service'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-1433215431968113964</id><published>2007-04-13T13:34:00.000-07:00</published><updated>2007-04-13T13:44:48.552-07:00</updated><title type='text'>Особенности учебного процесса заочного отделения</title><content type='html'>В настоящее время я переживаю сессию :)&lt;br /&gt;&lt;br /&gt;Недавно была лабораторная работа по операционной системе Unix, которая продолжалась 4 пары.&lt;br /&gt;&lt;br /&gt;Хорошенько выспавшись, и опоздав на целый час, пришел на нее со своим ноутбуком, потому как на своем Ubuntu Linux 6.10 в графическом окружении Gnome мне будет легче писать лабы.&lt;br /&gt;&lt;br /&gt;Дело было в субботу утром, и, оказалось что сервер Solaris в этот момент был нам недоступен по техническим причинам, а системных администраторов нет, потому как выходной.&lt;br /&gt;&lt;br /&gt;И тут, значит, являюсь я,  с ноутбуком и обжатой витой парой в сумке...&lt;br /&gt;&lt;br /&gt;Наблюдаю картину, как несколько человек сидит и читает методички и при&lt;br /&gt;этом на практике сделать не может ничего.&lt;br /&gt;&lt;br /&gt;После некоторой дискуссии с лаборантом и одного телефонного звонка домой системному администратору, мне выдают один свободный IP-адрес, после чего я подключаюсь к коммутатору, добавляю новых пользователей, устанавливаю пакеты для работы Telnet и SSH, После чего вся группа ходит на мой мобильный Linux-сервер... :))&lt;br /&gt;&lt;br /&gt;Да, если кто не в курсе, я - .NET программист :)))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-1433215431968113964?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/1433215431968113964/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=1433215431968113964' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1433215431968113964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/1433215431968113964'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/04/blog-post_13.html' title='Особенности учебного процесса заочного отделения'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5184667931452444492.post-7735327353899853715</id><published>2007-04-13T13:21:00.000-07:00</published><updated>2007-04-13T13:32:44.637-07:00</updated><title type='text'>Первая заметка</title><content type='html'>Долгое время думал о создании блога, вот наконец-то решился :)&lt;br /&gt;&lt;br /&gt;Не знаю, насколько это будет оправдано, просто иногда хочется одну и ту-же информацию донести сразу до нескольких своих друзей, при этом не теряя важные моменты.&lt;br /&gt;&lt;br /&gt;Попробую воспользоваться для этого блогом, быть может из этого что-нибудь да получится.&lt;br /&gt;&lt;br /&gt;О чем вообще в этом блоге может пойти речь?&lt;br /&gt;&lt;br /&gt;Я работаю инженером по разработке программного обеспечения (Software Engineer) в Харькове.&lt;br /&gt;&lt;br /&gt;Как показывает практика, делаю практически все, что связано со словом .NET :) Уверенно себя чувствую в области ASP.NET, ADO.NET, Windows Service. Наверное наибольшие пробелы у меня в сфере .NET Remoting и, особенно, Windows Forms. Но, надеюсь, что со вторым, в случае "столкновения", особых проблем не будет.&lt;br /&gt;&lt;br /&gt;На досуге люблю сидеть ковырять различный интересный софт, при этом, отдаю предпочтение свободному программному обеспечению. Естественно, стараюсь придерживаться некоторого баланса между реалиями жизни и идейными предпочтениями.&lt;br /&gt;&lt;br /&gt;Мне очень симпатична операционная система Linux за ее открытость, гибкость и переносимость.&lt;br /&gt;&lt;br /&gt;Когда-то в далеком прошлом долгое время увлекался программированием на С++ и Assembler.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5184667931452444492-7735327353899853715?l=status-alexus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://status-alexus.blogspot.com/feeds/7735327353899853715/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5184667931452444492&amp;postID=7735327353899853715' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7735327353899853715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5184667931452444492/posts/default/7735327353899853715'/><link rel='alternate' type='text/html' href='http://status-alexus.blogspot.com/2007/04/blog-post.html' title='Первая заметка'/><author><name>Alexey Diyan</name><uri>http://www.blogger.com/profile/06891673792901079262</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
