понедельник, 3 декабря 2007 г.

Приведение файлов к единой кодировке

Обнаружил, что у меня в проекте куча файлов с разными кодировками (utf и windows-1251). Захотелось привести это наследие проклятого прошлого и мрачного настоящего к одной единственной и неповторимой utf8. Все оказалось очень даже просто, при наличии соответствующих инструментов. В качестве перекодировщика была взята утилита enca, которая замечательно определяет русские (да и не только) кодировки и может конвертировать файл в указанную кодировку. Небольшой примерчик скрипта на groovy, который собственно и перекодирует нужные файлы в каталоге:
src="mysrc" // каталог с рабочими файлами

ant = new AntBuilder()

scanner = ant.fileScanner {
   fileset(dir:src) {
       include(name:"**/*.java")
       include(name:"**/*.groovy")
       include(name:"**/*.gsp")
       include(name:"**/readme")
       include(name:"**/*.txt")
       include(name:"**/*.css")
   }
}

for (f in scanner) {                   
   ant.exec(executable:"enca") {
       arg(line: "-x utf8 "+f)
   }
}
Этот пример прекрасно запускается в ubuntu.

четверг, 29 ноября 2007 г.

Настройка log4j

Настройка log4j, которая не мешает разработке. Все что нужно, это что бы сообщения об ошибках в чем угодно (и свой и чужой код) всегда показывались на консоли и сохранялись в файл. А сообщения info, которыми запросто может обрасти код приложения, вываливались на консоль в режиме разработки. Вот на чем остановился (файл Config.groovy):
log4j {
  appender.stdout = "org.apache.log4j.ConsoleAppender"
  appender.'stdout.layout' = "org.apache.log4j.PatternLayout"
  appender.'stdout.layout.ConversionPattern' = '%d %-6p [%-10t] %-15c{1} - %m%n'

  appender.errors = "org.apache.log4j.FileAppender"
  appender.'errors.layout' = "org.apache.log4j.PatternLayout"
  appender.'errors.layout.ConversionPattern' = '%d %-6p [%-10t] %-15c{1} - %m%n'
  appender.'errors.File' = "error.log"

  rootLogger = "error,stdout,errors"

  logger {
      StackTrace = "error,errors"
  }
  additivity.StackTrace = false
}


environments {
  development {
      log4j {
          logger {
              grails = "info,"
          }
      }
  }
}
Поясню некоторые моменты:
  • rootLogger = "error,stdout,errors" - все ошибки будут валится на консоль и в файл
  • grails = "info," - все логгирование из приложения будет валится на консоль

суббота, 25 августа 2007 г.

Снимок экрана в wxPython

Понадобилось мне тут снять изображение с формы в файл. Приготовился я к долгим поискам этой фичи, а все оказалось очено просто:
def toFile(f):
   f.Update()
   context = wx.ClientDC(f)
   memory = wx.MemoryDC()
   x, y = f.GetClientSizeTuple()
   bitmap = wx.EmptyBitmap(x, y, -1)
   memory.SelectObject(bitmap)
   memory.Blit(0, 0, x, y, context, 0, 0)
   memory.SelectObject(wx.NullBitmap)
   bitmap.SaveFile("temp/test.png", wx.BITMAP_TYPE_PNG)
Здесь f - это любой компонент wxPython. Перед снимком нужно обязательно сделать f.Update(), что бы компонент перерисовался и в файл попало правильно нарисованное изображение. Взято отсюда: http://wiki.wxpython.org/index.cgi/WorkingWithImages