Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

Показаны сообщения с ярлыком tool. Показать все сообщения
Показаны сообщения с ярлыком tool. Показать все сообщения

BITS Manager v1.01.0000

Новая версия BITS Manager. Позволяет управлять состоянием задач, а также менять их приоритеты. Появился простенький About.

Download BITS Manager v1.01.000

InstallShield, как обычно, радует - upgrade с предыдущей версии не работает. Нужно ее вручную удалить. Также нежелательно запускать инсталлятор прямо из архива.

Next version: BITS Manager v1.02.0000.

BITS monitoring and management tool

Представляю вашему вниманию первую версию утилиты по управлению службой Background Intelligent Transfer Service (BITS).
BITS Manager

Программа отображает активное состояние очереди задач. Управлять задачами пока еще нельзя. Скачать установщик можно здесь.

Программа, кстати, отображает список задач всех пользователей, если ее запустить из-под администратора.
Windows Updates
BITS Manager displays WUS download jobs

Even process explorer has bugs

Process Explorer error
Process Explorer error

IconWorkshop for Visual Studio 2008

Появилась Axialis IconWorkshop™ Lite для Microsoft Visual Studio® 2008. Скачать можно здесь.

Convert FLAC or APE to MP3

Пошаговая инструкция по перегону LOSSLESS форматов FLAC, APE в MP3.

Необходимые утилиты

Нужно скачать и поставить следующие пакеты:

  1. flac-1.2.1b.exe
  2. MAC_399F.exe
  3. eac-0.99pb4.exe
  4. LameXP.2008-08-12.zip

Конвертация FLAC или APE в MP3

Выполняется в два этапа:

  • Преобразование FLAC или APE в WAV с опциональным разбитием монолитного файла на отдельные треки
  • Преобразование WAV в MP3

Преобразование FLAC или APE в WAV

Следующие команды делают преобразование:

for %i in (*.flac) do "C:\Program Files\FLAC\flac.exe" -d "%i"
for %i in (*.ape) do "C:\Program Files\Monkey's Audio\MAC.exe" "%i" "%~ni" -d

Запускать нужно в папке с FLAC или APE файлами.

Если диск не разбит на треки (монолитный файл с идущими подряд дорожками), то выполнить разбивку можно утилитой EAC (при наличии cue-файла). Утилита графическая и интуитивно понятная, описывать не буду.

Преобразование WAV в MP3

LameXP делает это преотличнейшим образом и использует кодек LAME, который считают лучшим. Визуально тоже все понятно, разберетесь.

Последняя версия LameXP умеет делать mp3 сразу из flac!

Преподаватель сексологии:
- По статистике 18% женщин постоянно хотят, 23% обожают оральный секс 38% регулярно изменяют мужьям.
Студент с задней парты:
- К черту статистику, нам нужны имена, адреса, телефоны!!!

ReSharper 4.0 is released

Greetings from JetBrains!

We are pleased to announce the general availability of ReSharper 4.0!

This release brings you the most up-to-date support for C# 3.0, including LINQ, and Visual Studio 2008 in general. The major upgrade also features multiple new usability and productivity-boosting tools, such as standard class library annotations, solution-wide analysis (for C#), versatile code cleanup, new automated refactorings, new and improved code-editing capabilities, and more.

Complete product information about JetBrains ReSharper is available at http://www.jetbrains.com/resharper.

ReSharper 4.0 is available for a 30-day free trial download at http://www.jetbrains.com/resharper/download. No evaluation licenses are required.

New customers can purchase ReSharper 4.0 online at http://www.jetbrains.com/resharper/buy.

Please NOTE: All those who have purchased ReSharper 3.0 or ReSharper 3.1 after December 21, 2007 qualify for a free upgrade!

Wishing you develop with pleasure!! Team JetBrains

ReSharper 4.0 Beta is available!

JetBrains heralds a happy release of ReSharper 4.0 Beta, a state-of-the-art productivity tool for .NET developers! ReSharper 4.0 introduces a substantial pack of new features and improvements, of which the following are presumably the most delicious:

  • Comprehensive support for Visual Studio 2008 and C# 3.0, including LINQ, implicitly typed locals and arrays, extension methods, automatic properties, lambda expressions, object & collection initializers, anonymous types, expression trees, and partial methods.
  • Solution-wide analysis, a feature that looks for erroneous C# code in your whole solution on-the-fly, without compiling it first.
  • .NET Framework classes annotated with custom attributes to make ReSharper analyze your code even better than before - for instance, to let it know where format strings should be passed or where null values can or can not be assigned.
  • Code Cleanup - a powerful successor to Reformat Code. By simply running Code Cleanup, you can instantly apply a dozen of actions, including arranging 'this' qualifiers, removing code redundaicies, migrating to auto-properties, optimizing using directives, and many more.
  • All ReSharper's refactorings now support C# 3.0. New members of the refactoring family are available, including a pack of C# 3.0-specific refactorings.
  • Multiple new productivity features. This is to mention just a few:
    • Complete Statement. This is a new feature that inserts necessary syntax elements (braces, semicolons etc.) and gets you to the position to start the next statement.
    • CamelHumps in Code Completion. In ReSharper 4.0, all three completion features - Symbol Completion, Smart Completion, and Import Symbol Completion - let you complete any symbol by entering only its uppercase characters.
    • Live Templates Editor is a redesigned set of tools to view, manage, and edit ReSharper's three types of templates. From now on, you can manage and classify your templates in a special-purpose dialog box, and edit them right in a Visual Studio code pane.
    • Recent Edits - a drop-down list similar to existing Go To features that shows files and symbols that you recently modified.
  • Smoother interaction with Visual Studio ecosystem. The quality of interaction with frameworks, add-ins, version control clients and other members of the Visual Studio ecosystem is brought to a new level. The list includes .NET Compact Framework, BizTalk, and Silverlight.
  • ASP.NET Speedup. ReSharper 4.0 significantly speeds up analysis of ASP.NET pages, to enable more web developers benefit from the great toolset that ReSharper provides.

As before, ReSharper comes in three editions: Full, C# and VB.NET, which are called on to bring every customer precisely what they need - and enjoy the savings.

Download the beta version of ReSharper 4.0 to test the power of new capabilities and help us put the finishing touch on the product. Whatever edition you want, whatever version of Visual Studio you use, there's a single download file for all.

Develop with pleasure! The JetBrains Team

PL/SQL Developer preferences on Vista

AllRoundAutomations PL/SQL Developer has a bug under Windows Vista which forces the program to reset all user preferences to default values on restart. To solve the problem run it as Administrator.

There is an alternative way to overcome the issue - just set a deny write ACL for C:\Users\%USERNAME%\AppData\Roaming\PLSQL Developer\Preferences\%USERNAME%\default.ini as all preferences has been configured and before the program starts once again.

Easy reporting to Word, PDF, HTML

Тяжело работать с людьми, которые сами не знают, чего хотят. Еще хуже, если эти люди являются заказчиками программного обеспечения. Они требуют за копейки кнопку "Сделать все". А потом еще чуть-чуть. И я уже не первый раз наблюдаю эту ситуацию. А самое веселое, когда дело доходит до отчетов. Мы хотим, чтобы был дизайнер. А еще мы хотим, чтобы все было попроще. А еще мы не знаем, что это будут за отчеты, так что сделайте универсальное решение. И ломай потом голову.

Я считаю, что дизайнер стоит кучу денег, для его написания нужен не один человеко-год. И пока что не видел ни одного универсального решения, с которым пользователь ощущал бы себя не обезьяной. Наиболее приемлемый вариант - вбивать логику построения отчета в программу. Дешево и сердито! Ну, дальше изложу один из вариантов такого решения.

Для получения отчета нужно:

  1. Данные

    Строки, числа, даты необходимые для построения отчета.

  2. Шаблон

    Набор правил построения отчета.

  3. Процессор

    Механизм, преобразующий данные по правилам.

В самом сложном варианте эти компоненты создаются индивидуально для каждого отчета. Но, лучше, конечно, по-максимуму автоматизировать каждую часть и их взаимодействие. В идеале, шаблон редактируется с помощью developer-friendly designer, процессор является универсальным готовым решением, а данные представляют собой расширяемый формат, в который можно положить любые данные.

XML, XSLT 2.0 и Altova StyleVision

Итак, данные в формате XML преобразуются XSLT процессором в выходной файл.

Altova StyleVision является нашим самым главным фигурантом и помощником, он же developer-friendly designer. Это визуальный редактор, который позволяет получить на выходе XSLT 2.0 файл, преобразующий XML в HTML, RTF или PDF!

Я уже точно не помню, зачем понадобился именно XSLT 2.0, вероятно из-за каких-то фич дизайнера, но вот найти бесплатный процессор для Java было напряжно. Из коммерческих есть Oracle XML Developer's Kit, из некоммерческих - Saxon. Других не нашел! С .NET ситуация хуже, под него только Saxon. Ну, Saxon так Saxon!

Исходные данные

Исходные данные получаем из источника данных (БД, например) и формируем XML файл с определенной схемой, которая описывается в XSD. Механизм формирования не имеет значения, но, если данные качаются из БД, я бы предпочел возложить этот процесс на сервер (далее в примере я буду получать от любимой СУБД Oracle сразу XML, а если поднатужиться, то и файл с отчетом можно получить!).

Я буду использовать существующую схему SH (Sales History). Как ее установить написано здесь.

Итак, наш отчет будет выдавать некую информацию о клиенте - имя, фамилия, пол, дата рождения и т.д. StyleVision хочет видеть XSD схему документов, которые прийдется использовать в качестве данных. Схему можно создавать либо вручную, подгоняя потом под нее XML, либо построить по существующему XML. Все это, кстати умеет делать Altova XMLSpy. Вот моя схема (Customer.xsd):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:simpleType name="T_Valid">
      <xs:restriction base="xs:string">
         <xs:enumeration value="I"/>
         <xs:enumeration value="A"/>
      </xs:restriction>
   </xs:simpleType>
   <xs:simpleType name="T_Gender">
      <xs:restriction base="xs:string">
         <xs:enumeration value="M"/>
         <xs:enumeration value="F"/>
      </xs:restriction>
   </xs:simpleType>
   <xs:complexType name="T_Customer">
      <xs:sequence>
         <xs:element ref="FirstName"/>
         <xs:element ref="LastName"/>
         <xs:element ref="Gender"/>
         <xs:element ref="YearOfBirth"/>
         <xs:element ref="Address"/>
         <xs:element ref="Valid"/>
      </xs:sequence>
   </xs:complexType>
   <xs:complexType name="T_Address">
      <xs:sequence>
         <xs:element ref="Street"/>
         <xs:element ref="PostalCode"/>
         <xs:element ref="City"/>
         <xs:element ref="StateProvince"/>
         <xs:element ref="Country"/>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="YearOfBirth" type="xs:short"/>
   <xs:element name="Valid" type="T_Valid"/>
   <xs:element name="Street" type="xs:string"/>
   <xs:element name="StateProvince" type="xs:string"/>
   <xs:element name="PostalCode" type="xs:int"/>
   <xs:element name="LastName" type="xs:string"/>
   <xs:element name="Gender" type="T_Gender"/>
   <xs:element name="FirstName" type="xs:string"/>
   <xs:element name="Customer" type="T_Customer"/>
   <xs:element name="Country" type="xs:string"/>
   <xs:element name="City" type="xs:string"/>
   <xs:element name="Address" type="T_Address"/>
</xs:schema>

Соответственно, Oracle SQL запрос (в SQL Server этот запрос был бы на пару страниц неразбираемого текста):

SELECT XMLElement("Customer",
                  XMLElement("FirstName", c.cust_first_name),
                  XMLElement("LastName", c.cust_last_name),
                  XMLElement("Gender", c.cust_gender),
                  XMLElement("YearOfBirth", c.cust_year_of_birth),
                  XMLElement("Address",
                             XMLElement("Street", c.cust_street_address),
                             XMLElement("PostalCode", c.cust_postal_code),
                             XMLElement("City", c.cust_city),
                             XMLElement("StateProvince", c.cust_state_province),
                             XMLElement("Country",
                                        (SELECT country_name FROM sh.countries WHERE country_id = c.country_id)
                             )
                  ),
                  XMLElement("Valid", c.cust_valid)) AS DATA
  FROM sh.customers c
 WHERE c.cust_id = 43228

Вместо 43228, конечно, нужно сделать bindable переменную, но мне лень.

И его результат (Customer.xml):

<Customer>
   <FirstName>Abner</FirstName>
   <LastName>Everett</LastName>
   <Gender>M</Gender>
   <YearOfBirth>1957</YearOfBirth>
   <Address>
      <Street>117 West Gloucester Avenue</Street>
      <PostalCode>72059</PostalCode>
      <City>Los Angeles</City>
      <StateProvince>CA</StateProvince>
      <Country>United States of America</Country>
   </Address>
   <Valid>I</Valid>
</Customer>

Altova StyleVision

File -> New -> New from XML Schema / DTD..., указать путь к XSD файлу и желательно предоставить ему сразу файл-пример с данными, соответствующий этой схеме, конечно же.

После окончания создания шаблона (template.sps) нужно его сохранить в XSLT (transform-rtf.xslt): File -> Save Generated Files -> Save Generated XSLT-RTF File....

Saxon

What is Saxon?

The Saxon package is a collection of tools for processing XML documents. The main components are:

  • An XSLT 2.0 processor, which can be used from the command line, or invoked from an application, using a supplied API. This can also be used to run XSLT 1.0 stylesheets.
  • An XPath 2.0 processor accessible to applications via a supplied API.
  • An XQuery 1.0 processor that can be used from the command line, or invoked from an application by use of a supplied API.
  • An XML Schema 1.0 processor. This can be used on its own to validate a schema for correctness, or to validate a source document against the definitions in a schema. It is also used to support the schema-aware functionality of the XSLT and XQuery processors. Like the other tools, it can be run from the command line, or invoked from an application.
  • On the Java platform, when using XSLT, XPath, or XML schema validation, the API supported by Saxon is the JAXP API, which means it is possible for a Java application to switch between different XSLT, XPath, and XML Schema processors without changing the application code. At the time of writing, however, Saxon is still the only JAXP implementation that offers support for XSLT 2.0. Saxon offers two APIs for XQuery processing: its own native API, which has been present in the product for some time, and an early implementation of the XQJ specification which is under development as part of the Java Community Process.
  • On the .NET platform, Saxon offers an API that enables close integration with other services available from .NET, notably the XML-related classes in the System.Xml namespace. It isn't possible to use Saxon as a transparent plug-in replacement for the System.Xml.Xsl processor, because the API for the Microsoft engine using concrete classes rather than abstract interfaces. However, it is possible to use it as a functional replacement with minor changes to your application code.

Saxon implements XSLT 2.0, XPath 2.0, and XQuery 1.0 as defined in the final Recommendations of 23 January 2007. It also includes an implementation of the XML Schema 1.0 Recommendation.

Full details of Saxon's conformance to the specifications are provided in the Conformance section.

In addition, Saxon provides an extensive library of extensions, all implemented in conformance with the XSLT and XQuery Recommendations to ensure that portable stylesheets and queries can be written. These include the EXSLT extension libraries common, sets, math, and dates-and-times. Many of these extensions were pioneered in Saxon and have since become available in other products.

These extension functions are in general accessible from XQuery and XPath as well as XSLT, except where they depend on stylesheet information. Some extensions are available in Saxon-SA only.

Компиляция XSLT файла

Библиотека Saxon позволяет компилировать XSLT файл:

The term compile is stretching a point. The executable that is produced does not contain machine instructions, or even interpreted Java bytecode. It contains instructions in the form of a data structure that Saxon itself can interpret. Note that the format of compiled stylesheets is unlikely to be stable from one Saxon release to the next.

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

java -cp d:\Development\Libs\Java\Saxon.v9\saxon9.jar net.sf.saxon.Compile transform-rtf.xslt transform-rtf.saxon

transform-rtf.xslt - входной файл, transform-rtf.saxon - выходной.

Java код

Все просто - подключение к БД, выполнение запроса, получение потока XML, загрузка скомпилированного шаблона, создание трансформера и преобразование XML в RTF.

 0: /**
 1:  *
 2:  */
 3: package com.chabster.reporting.app;
 4:
 5: import java.io.File;
 6: import java.io.InputStream;
 7: import java.sql.Connection;
 8: import java.sql.DriverManager;
 9:
10: import javax.xml.transform.*;
11: import javax.xml.transform.stream.StreamResult;
12: import javax.xml.transform.stream.StreamSource;
13:
14: import net.sf.saxon.Configuration;
15: import net.sf.saxon.PreparedStylesheet;
16: import oracle.jdbc.OraclePreparedStatement;
17: import oracle.jdbc.OracleResultSet;
18: import oracle.jdbc.driver.OracleDriver;
19: import oracle.sql.OPAQUE;
20:
21: /**
22:  * @author Chabster
23:  */
24: public class Startup
25: {
26:
27:   static String query = "SELECT XMLElement(\"Customer\",\r\n" +
28:         "                 XMLElement(\"FirstName\", c.cust_first_name),\r\n" +
29:         "                 XMLElement(\"LastName\", c.cust_last_name),\r\n" +
30:         "                 XMLElement(\"Gender\", c.cust_gender),\r\n" +
31:         "                 XMLElement(\"YearOfBirth\", c.cust_year_of_birth),\r\n" +
32:         "                 XMLElement(\"Address\",\r\n" +
33:         "                            XMLElement(\"Street\", c.cust_street_address),\r\n" +
34:         "                            XMLElement(\"PostalCode\", c.cust_postal_code),\r\n" +
35:         "                            XMLElement(\"City\", c.cust_city),\r\n" +
36:         "                            XMLElement(\"StateProvince\", c.cust_state_province),\r\n" +
37:         "                            XMLElement(\"Country\",\r\n" +
38:         "                                       (SELECT country_name FROM sh.countries WHERE country_id = c.country_id)\r\n" +
39:         "                            )\r\n" +
40:         "                 ),\r\n" +
41:         "                 XMLElement(\"Valid\", c.cust_valid)) AS DATA\r\n" +
42:         "  FROM sh.customers c\r\n" +
43:         " WHERE c.cust_id = 43228";
44:
45:   public static void main(String[] args) {
46:      try {
47:         DriverManager.registerDriver(new OracleDriver());
48:
49:         Connection conn = DriverManager.getConnection("jdbc:oracle:thin:chabster/***@localhost:1521/MAIN");
50:         OraclePreparedStatement preparedStmt = (OraclePreparedStatement) conn.prepareStatement(query);
51:
52:         OracleResultSet oraRS = (OracleResultSet) preparedStmt.executeQuery();
53:         oraRS.next();
54:         OPAQUE xmlObj = oraRS.getOPAQUE(1);
55:         Configuration configuration = new Configuration();
56:         InputStream xmlStream = xmlObj.getStream();
57:
58:         PreparedStylesheet preparedStylesheet = PreparedStylesheet.loadCompiledStylesheet(configuration, "transform-rtf.saxon");
59:
60:         Transformer transformer = preparedStylesheet.newTransformer();
61:         File outputFile = new File("out.rtf");
62:         Source xmlSource = new StreamSource(xmlStream);
63:         Result output = new StreamResult(outputFile);
64:
65:         transformer.transform(xmlSource, output);
66:
67:         xmlStream.close();
68:         oraRS.close();
69:         preparedStmt.close();
70:         conn.close();
71:      }
72:      catch (Exception ex) {
73:         ex.printStackTrace();
74:      }
75:   }
76: }

Выводы

Механизм прост и удобен для разработчика. Генерация файлов происходит быстро, поддерживаются основные форматы документов - HTML, RTF и PDF. Правда, есть и свои нюансы, связанные с ограниченными возможностями дизайнера Altova StyleVision. Например, если в отчет нужно вставить картинку из БД, то прийдется это писать частично вручную. Также минимальный размер генерируемого файла - 46 Kb! Плюс вечно плавающие стандарты W3C и отсутствие библиотек, которые их поддерживают.

Best subtitle editor

Jubler logo Jubler subtitle editor пока что лучшая утилита для редактирования, конвертации или создания файлов субтитров. Интерфейс несколько неудобен (Java), но альтернатив я не нашел.

Заодно выкладываю парочку субтитров, с поиском которых возникли проблемы.

NewsGator FeedDemon became free

Free beer Мой Best RSS Reader - NewsGator FeedDaemon. И он теперь стал бесплатным!

Также в скором времени бесплатными станут NetNewsWire, NewsGator Inbox и NewsGator Go.

Shared Source Solutions for Developers

Вот наткнулся на Майкрософтовский список свободно распостраняемых библиотек, примеров, дополнений и утилит.
Почти все ссылается на CodePlex.

Best RSS Reader

Когда я только начал использовать RSS, то первым запросом в Гугл стал этот. Результаты, конечно, бестолковые, но Google Reader был замечен и оценен.

Я не люблю, когда мальчикам доверяют мужскую работу. Поэтому всегда по-возможности предпочитаю десктопные приложения. У Google Reader, правда, есть одно существенное преимущество - возможность просматривать RSS не отрываясь от браузера (кстати, плагин Wizz RSS для Мозиллы тоже неплох).

Ладно. К черту веб. Приложение, на котором я остановился - FeedDemon. Альтернатив с таким функционалом просто нет. Правда, хитрые дядьки для отображения контента используют IE Host :).

Microsoft Line Of Code Counter

Microsoft Line Of Code Counter - порядочно полезная утилита!

Из названия понятно, что считает строчки кода. Но это не аналог Project Line Counter т.к. позволяет

  • использовать источник файлов (TFS, VSS или каталог файловой системы)
  • выполнять подсчет изменений содержимого файлов
  • считать метрики по различным методологиям

Гибко настраивается через XML файл. Изначально поддержка всех основных MS-языков. Работает как в составе Visual Studio 2005 так и отдельно.

TypeMock.NET

По словам моего сотрудника, человека с приличным опытом, TypeMock.NET - лучшее решение для генерации (точнее сказать - просто решение, но об этом позже) Mock-объектов и использования их в юнит тестах.

Традиционные Mock фреймворки имеют определенные требования к объектной модели, обусловленные принципами функционирования - сабклассинг и динамическая генерация кода. Эти требования нередко заставляют проектировать с учетом необходимости юнит тестирования посредством Mock-объектов, что негативно сказывается на конечном результате и удобстве использования. Некоторые вещи вообще с трудом подлежат юнит тестированию, например, классы, использующие внешние статические методы. Решается либо условной компиляцией (далеко не уйдешь) либо перепрограммированием механизма взаимодействия объектов (порядочное усложнение существующего кода).

Итак, почему же "#1 Mocking Framework"? Лучше всего сразу посмотреть на возможности TypeMock.NET, который доступен в 3-х редакциях - Community (бЭсплатно), Professional и Enterprise (соответсвенно, за денюжку).

Если пройтись по списку фич, можно заметить такие интересные и, на первый взгляд, невозможные вещи, как "mock all types, including sealed and internal classes", "fake any method", "mock third-party types, including types in the .NET framework". Нам заявляют, что TypeMock способен подделать поведение любого объекта, в т.ч. его статических методов!

Банальнейший пример демонстрирует, что sealed класс SqlConnection начинает вести себя так, как ему приказано! Шокирующих примеров хватает.

Досих пор меня мучил главный вопрос - как это работает?! Парочка часов скитаний по сети увенчалась успехом! Итак айнц, цвай, драй. И все стало на свои места.

Хитрое решение - перехватывать события .NET приложения (например, вызов метода) с помощью публично доступного Profiler API (на этом, кстати, построены все профайлеры .NET приложений) и подменять исходное поведение требуемым. Хитрое, но не идеальное, т.к. возникают проблемы с отладкой юнит тестов.

Как итог могу написать, что TypeMock решает главную проблему, связанную с юнит тестированием, - проблему создания изолированно-тестируемых классов. С TypeMock об этом вообще можно смело забыть.

Copyright 2007-2011 Chabster