воскресенье, 19 сентября 2010 г.
Собираем ffmpeg для Android
суббота, 18 сентября 2010 г.
Вертикальный ProgressBar в Android
понедельник, 5 июля 2010 г.
Адаптеры в Android
Нынешняя статья будет посвящена такой важной теме, как адаптеры. Ведь каждому, кому приходится сталкиваться с ListView или Spinner или там ListActivity волей-неволей приходится с ними разбираться.
понедельник, 26 апреля 2010 г.
Багофича в LoggerAppenderDailyFile
LoggerAppenderDailyFile
. И не могу понять, бага это или фича.воскресенье, 25 апреля 2010 г.
Введение в Log4php, часть 2. Использование
суббота, 24 апреля 2010 г.
Введение в Log4php, часть 1. Конфигурация
Log4php относится к тому же семейству, что и любимый мной log4net, так что многие понятия повторяются. И, кстати, у log4php имеется достаточно хорошая документация. Настолько хорошая, что в этой моей статье, в общем-то, нет ровно ничего оригинального.
пятница, 9 апреля 2010 г.
Шпаргалка по MVVM в WPF
Тема, конечно, неоднократно поднятая, но я все равно напишу шпаргалку на тот случай, если вдруг когда-нибудь забуду. А то с WCSF тоже вроде разобралась, а прошло два месяца со сдачи проекта, и уже ничего и не помню...
Сразу предупрежу, что статья предназначена для того, чтобы быстро въехать в MVVM или быстро его вспомнить. Так что описание будет предельно краткое и схематичное.
Уважаемые коллеги! Эта статья написана в 2010 году. Я примерно с 2011 пишу только на Java под андроид и не помню про WPF ничего. Что-либо у меня спрашивать — бесполезно. Извините
вторник, 30 марта 2010 г.
eval в .NET
В данном случае eval — это вовсе не Eval
, который используется в дотнетовском датабиндинге. Здесь речь пойдет о том, как изобразить на .NET что-то, похожее на джаваскриптовый eval
.
А дело вот в чем. Сейчас я занимаюсь одним большим вычислительным проектом. И вот, возникла у меня следующая задача. Пользователи, которым нужно проводить эти вычисления, захотели интерфейс для того, чтобы самим править некоторые используемые формулы. Вследствие этого мне пришлось озаботиться вопросом, а как вообще делать произвольные вычисления в .NET. Чтобы взял строчку типа "2 + 2.3 * x * sin(y)", сказал, что x=3 и y=34, и посчиталось.
Ниже результаты моего ресерча. Может, кому пригодится.
воскресенье, 9 августа 2009 г.
Ежедневные логи на log4net
Недавно поступил вопрос:
A есть возможность писать лог каждый день в новый файл? Чтобы частью имени файла была дата?
Сделать такое можно. Нужно только в конфигурации appender-а написать следующее:
<appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender"> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <file value="debug" /> <appendToFile value="true" /><rollingStyle value="Date" /> <datePattern value="yyyyMMdd" /> <staticLogFileName value="false" /><maxSizeRollBackups value="10" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5p [%d] [%C.%M] %m%n" /> </layout> </appender>
Что же мы тут сделали? У класса RollingFileAppender
, который пишет лог в файл, есть такое свойство RollingStyle
, которое определяет, когда логгер будет начинать новый файл лога. Допустимы следующие значения:
- Size — новый файл создается, как только лог достигает определенного размера (этот размер задается в свойстве
maximumFileSize
). - Date — новый файл создается каждый день, и к названию файла, определенному в свойстве
file
, добавляется дата в формате, заданном в свойствеdatePattern
. - Composite — комбинирует свойства
Date
иSize
, т.е. учитываются и размер файла, и дата. Кроме того, данное значение является дефолтным для свойстваRollingStyle
. - Once — лог создается один раз при запуске программы.
Итак, в нашем примере мы задали RollingStyle = Date
(можно было бы и Composite
) и указали формат даты. Но, пока staticLogFileName = true
, все это будет игнорироваться, так что надо задать false
(эта часть мне несколько непонятна, в документации для staticLogFileName
написано другое, но на деле получается именно так). И теперь к имени файла с логом добавляется дата.
NB
Если в datePattern
мы напишем что-нибудь вроде yyyyMMdd.log
, то файлы, которые будут создаваться, будут называться debug20090808.loA.D.
. Это происходит из-за того, что g
также является возможным форматом даты. Логгер добросовестно применил этот формат и сообщил, что дата относится к нашей эре (кстати, тоже интересный вопрос: в MSDN написано, что формат эры — gg
, а g
— это general). Чтобы избежать таких ситуаций, символы, которые являются корректными форматами для дат, надо квотить:
<datePattern value="yyyyMMdd.lo\g" />
Кстати, txt это тоже касается.
среда, 22 июля 2009 г.
Дерево в выпадающем списке средствами XSLT
Задача
Допустим, у нас на сайте есть у нас нечто иерархическое. Например, категории товаров. У категорий есть подкатегории и так далее. И эта структура выражается в следующей XML-ке:
<categories> <category id="1" title="Процессоры"> <categories> <category id="2" title="Intel"> <categories> <category id="3" title="Intel Core LGA775"> <categories/> </category> <category id="4" title="Intel Core i7 LGA1366"> <categories/> </category> </categories> </category> <category id="6" title="AMD"> <categories> <category id="6" title="AMD Athlon AM2"> <categories/> </category> <category id="7" title="AMD Athlon II AM3"> <categories/> </category> </categories> </category> </categories> </category> <category id="8" title="Жесткие диски"> <categories> <category id="9" title="SATA"> <categories> <category id="10" title="Seagate"> <categories /> </category> <category id="11" title="Western Digital"> <categories /> </category> </categories> </category> <category id="12" title="IDE"> <categories> <category id="13" title="Seagate"> <categories /> </category> <category id="14" title="Western Digital"> <categories /> </category> </categories> </category> </categories> </category> </categories>
NB: На самом деле хранить строки в атрибутах не есть хорошо, их стоит делать отдельными узлами и заворачивать в CDATA. Однако, здесь title является именно атрибутом в целях экономии места. Так что прошу не брать дурной пример.
И тут нам стало нужно сформировать из этой XML-ки выпадающий список. Простейший способ это сделать — написать следующее преобразование:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="categories"> <select> <option value="0">Корневая категория</option> <xsl:apply-templates select="//category"/> </select> </xsl:template> <xsl:template match="category"> <option value="{@id}"> <xsl:value-of select="@title"/> </option> </xsl:template> </xsl:stylesheet>
В результате мы получим вот такую картину
В общем-то, работает, но хочется, чтобы дерево категорий и выглядело, как дерево. А, так как у нас тут select
, то получить это дерево можно только, расставив по нужным местам пробелы. Есть, конечно, optgroup
-ы, но они в данном случае нас не спасут, потому что у категорий может быть сколь угодно большая вложенность.
Решение
Вот такой велосипед решает заданную задачу:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template name="cat_tree" match="categories"> <xsl:param name="space" /> <xsl:for-each select="categories/category"> <option value="{@id}"> <xsl:value-of select="$space" /> <xsl:value-of select="@title"/> </option> <xsl:if test="./categories" > <xsl:call-template name="cat_tree"> <xsl:with-param name="space" select="concat($space, '  ')"/> </xsl:call-template> </xsl:if> </xsl:for-each> </xsl:template> <xsl:template match="/"> <select> <option value="0">Корневая категория</option> <xsl:call-template name="cat_tree"> <xsl:with-param name="space" select="'  '"/> </xsl:call-template> </select> </xsl:template> </xsl:stylesheet>
В итоге получаем следующее: