barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 27 февраля 2014 г.

Google Drive и Git: ошибка "fatal: Reference has invalid format: 'refs/heads/master (Конфликт 1)'"

Проблема

Использую Google Drive для хранения git-репозитория. При очередной попытке сделать из него Fetch получаю ошибку:
fatal: Reference has invalid format: 'refs/heads/master (Конфликт 1)'
Решение

Почему именно при синхронизации с гуглодиском возник конфликт, не знаю, но решение простое - удалить из refs/heads/master репозитория на Google Drive файл, на который ругается git.

вторник, 25 февраля 2014 г.

jQuery: очередь ajax-запросов

Задача:

Ajax-запросы, выполняемые с помощью jQuery, выполнять по одному и в строгой последовательности.

Решение:

Помнится, когда-то давно, когда стояла аналогичная задача с использованием YUI2, я писал очередь сам. Теперь же мне стало лень, и я, после недолгих поисков, нашел готовое решение: https://github.com/Foliotek/ajaxq. Просто, элегантно. Мне правда не хватило 2 вещей: ограничения на максимальную длину очереди и возможности вызвать hook непосредственно перед отправкой очередного запроса (для актуализации его полезной нагрузки), но это оказалось несложно допилить руками. Будет время - форкну проект на гитхабе и выложу свои доработки в общий доступ.

воскресенье, 23 февраля 2014 г.

Javascript: обработка клика на disabled-кноках

Обрабатывать клики на кнопках, сделанных недоступными посредством атрибута "disabled" нельзя. Единственный выход из ситуации - делать кнопки недоступными посредством некоторого собственного css-класса, выполнив эмуляцию (с помощью стилей и javascript-обработчиков) работы атрибута "disabled".

среда, 12 февраля 2014 г.

cmd: найти в подпапке и скопировать файл по фрагменту имени

Задача

Найти файл, лежащий в одной из подпапок текущей папки, и скопировать его в заданную папку.

Решение
for /f "tokens=*" %%a in ('Dir /b/s/a-d *<search>*') Do copy "%%a" C:\Temp
, где <search> - искомый фрагмент имени файла. Целевой папкой копирования здесь является C:\Temp.

Excel: поиск значения ячейки в некотором столбце

Задача

Есть некий массив значений, размещенный в столбце "А" листа "1". Есть другой массив значений, размещенный в столбце "D" листа "2". Необходимо на листе "1" в столбце "B" проставить флаг, есть ли соотв. значение из столбца "А" листа "1" в столбце "D" листа "2".

Решение

Формула для ячейки"B1" листа "1" будет следующая:
=IF(IFERROR(MATCH(А1;'2'!D:D;0);0)=0;0;1)
В ячейке будет стоять "0", если значение из ячейки А1 отсутствует в столбце D листа "2" и "1" в противном случае.

среда, 5 февраля 2014 г.

Ошибка "com.documentum.web.form.control.TagPoolingEnabledException: JSP tag pooling is not supported..." при старте webtop-based приложения на Tomcat 7

Проблема
При старте на Tomcat 7 приложения, построенного на базе webtop, валится ошибка:
com.documentum.web.form.control.TagPoolingEnabledException: JSP tag pooling is not supported. Please refer to the product deployment guide for instructions on turning off tag pooling for the application server
Решение
В conf/web.xml томката добавить следующие строки (выделены жирным):
<servlet>
   <servlet-name>jsp</servlet-name>
   <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
   <init-param>
      <param-name>fork</param-name>
      <param-value>false</param-value>
   </init-param>
   <init-param>
      <param-name>xpoweredBy</param-name>
      <param-value>false</param-value>
   </init-param>
   <init-param>
      <param-name>mappedfile</param-name>
      <param-value>true</param-value>
   </init-param>
   <init-param>
      <param-name>enablePooling</param-name>
      <param-value>false</param-value>
   </init-param>
   <load-on-startup>3</load-on-startup>
</servlet>
Также, возможно, потребуется очистить каталог /work/Catalina/localhost томката.

JavaMail: кодировка по-умолчанию, используемая в заголовках писем

Вообще, не-ascii заголовки в почтовых сообщениях кодируются в соответствии с RFC 2047 (http://www.faqs.org/rfcs/rfc2047/). При отправке почты с помощью Javamail столкнулся со следующей проблемой: формируется заголовок письма, имеющий вид:
=?UTF8?B?0J3QsNC/0YDQsNCy0LvQtdC9INC00L7QutGD0LzQtdC9?= =?UTF8?B?0YI6INC+0YjQuNCx0LrQuCDQsiBlbWFpbA==?=
Не совсем корректным здесь является имя используемой кодировки - "UTF8", в то время как IANA предписывает использовать имя "UTF-8", т.е. с дефисом (http://www.iana.org/assignments/character-sets/character-sets.xhtml). Такие заголовки "съедаются" Outlook'ом, веб-клиентами mail.ru и gmail.com, однако, например, SquirrelMail выводит такой заголовок "как есть", не выполняя декодирование. 
Для установки заголовка мой код (вернее не мой, а код open-source проекта, но не суть) испольует javax.​mail.​internet.​MimeMessage.setSubject(java.lang.String subject). В документации сказано, что данный метод использует "platform's default charset" (http://docs.oracle.com/javaee/6/api/javax/mail/internet/MimeMessage.html#setSubject(java.lang.String)), по факту - системное свойство file.encoding.
Посмотрев в стартовые скрипты приложения, я обнаружил, что там действительно указана опция jvm "-Dfile.encoding=UTF8". Поменяв ее на "-Dfile.encoding=UTF-8" я решил проблему с некорректным именем кодировки в заголовках отправляемых почтовых сообщений.