Преобразуем URL-адреса в правильный HTML
Отлично, когда система превращает написанный в тексте URL в “живой” – это всегда удобно. Сделать в ColdFusion это можно следующим образом:
<cfset t_sting = "Зайди на http://cfusion.ru - лучший русскоязычный блог о CF" /> <cfset t_string = REReplace(t_string, "([A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+)", "<a href="\1">\1</a>", "ALL") />
После чего вы получите такую строку:
Зайди на <a href="http://cfusion.ru">http://cfusion.ru</a> - лучший русскоязычный блог о CF
Область применения очень широка, но такой трюк вам обязательно пригодится.
ColdFusion Box
ColdFusion Box – это проект Adobe (air-приложение) благодаря которому вы сможете получать новости о ColdFusion.
CF Curriculum
На сайте Adobe появился отличный специальный обучающий раздел для новичков coldfusion-программирования.
Тут вы найдете множество материалов, рассказывающих и о работе с БД, компонентами, массивами и структурами и etc. Рекомендую.
ColdExt RC 1
Вышел первый кандидат-релиз ColdExt – лучшего способа использовать ExtJS в ваших coldfusion-проектах.
CF & Apache Derby
Как вы знаете, CF умеет работать с БД от Apache – Derby. Посмотрите видео о том как это делается:
Борьба с SQL-инъекциями
CF не более уязвим от такого рода инъекций, чем иной другой язык, поэтому я покажу основы того, как защититься от SQL-инъекций1 при разработке cf-приложений.
Как вообще эти инъекции работают? Хм, ну это просто. Какой-нибудь негодяй может модифицировать GET- или POST-запрос таким образом, что выполнятся либо дополнительные SQL-инструкции, либо вовсе не те, которые должны были. Соответственно, негодник получит доступ к данным, которые предназначены не для его глаз – как правило это приватная информация пользователя или сразу группы оных.
Чтобы проверить ваше приложение еще на уровне разработки, подвержено оно SQL-инъекциям или нет, вы можете воспользоваться чудным и бесплатным к тому же air-инструментом – SQLFury.
А теперь, чтобы понять от чего нам защищаться, давайте поглядим на обычный cf-запрос:
<cfquery name="q" datasource="d"> select * from posts where postsid=#url.id# </cfquery>
Как видно, тут мы пытаемся сделать выборку сообщения, с числовым идентификатором переданным через URL. А что будет, если передать не число, а текст? Правильно – ошибка.
Но, можно модифицировать запрос:
http://localhost/?id=75%union%select%BASE_SCHEMA_VER%as%id,name%as%strmodelname,%name%as%strModelDescription%from%sysobjects
То есть передать такой sql-запрос:
union select BASE_SCHEMA_VER as id,name as strmodelname, name as strModelDescription from sysobjects
И это уже будет не хорошо.
Получаем MAC-адрес
Как получить Mac-адрес средствами Coldfusion? Легко!
<cfscript> j=createobject("java", "java.net.InetAddress"); m=createobject("java", "java.net.NetworkInterface"); a=j.getLocalHost(); mac=m.getByInetAddress(a).getHardwareAddress(); </cfscript> <cfdump var="#mac#">
Удачи.
Ресайзим изображение при помощи CF и .Net
Нашёл тут отличный пример того, как отличается выполнение одних и тех же задач в Coldfusion и .Net – а именно, ресайз изображений с 1024х700 до 250 пикселей по ширине.
Вот CF-код:
<cfimage
action = "resize"
height = ""
width = "250"
source = "#sourceFile#"
destination = "#resizedFile#"
overwrite = "yes">
А вот .Net-код:
static void ResizeImageByWidth(string orgName, string resizeName, int resizeWidth) { String src = orgName; String dest = resizeName; int thumbWidth = resizeWidth; //Get the source image to a System.Drawing.Image object System.Drawing.Image image = System.Drawing.Image.FromFile(src); //Create a System.Drawing.Bitmap with the desired width and height of the thumbnail. int srcWidth = image.Width; int srcHeight = image.Height; Decimal sizeRatio = ((Decimal)srcHeight / srcWidth); int thumbHeight = Decimal.ToInt32(sizeRatio * thumbWidth); Bitmap bmp = new Bitmap(thumbWidth, thumbHeight); //Create a System.Drawing.Graphics object from the Bitmap which we will use to draw the high quality scaled image System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp); //Set the System.Drawing.Graphics object property SmoothingMode to HighQuality gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //Set the System.Drawing.Graphics object property CompositingQuality to HighQuality gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //Set the System.Drawing.Graphics object property InterpolationMode to High gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //Draw the original image into the target Graphics object scaling to the desired width and height System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, thumbWidth, thumbHeight); gr.DrawImage(image, rectDestination, 0, 0, srcWidth, srcHeight, GraphicsUnit.Pixel); //Save to destination file bmp.Save(dest); //dispose / release resources bmp.Dispose(); image.Dispose(); }
Как говорится разницу легко заметить.
Mach-II 1.6
Тут оказывается вышел финальный релиз Mach-II 1.6 – хорошо известного и одного из старейших coldfusion-фреймуорков на свете.
Разработчики потрудились на славу – тут и кэширование и логгирование, и ещё море всяческих полезных штук, которые давно были в списках ожидания.
Особенно подробно о нововведениях рассказано в специальном сообщении блога разработчиков.
Секреты CF8
Предлагаю вашему вниманию запись выступления Чарли Айрехарта на Adobe MAX, посвящённую секретам Coldfusion:
А кому лень смотреть видео, тот может скачать .pdf с презентацией.
Читаем документы MS Office
Сегодня Рей опубликовал отличный пост о том, как при помощи coldfusion читать документы, созданные в MS Office.
Рей, кроме того, приводит и рабочий вариант кода, а также некоторые советы.
OpenBD начала поддерживать cfvideoplayer
Это просто фантастическая новость. Бесплатный альтернативный coldfusion-сервер OpenBD начал поддерживать новый cf-тег – cfvideoplayer, который, понятное дело, будет проигрывать вам всякие медиа-файлы без каких-либо усилий.
В качестве плеера используется FlowPlayer, проект достаточно известный, и который уже поставляется вместе с самим OpenBD.
Что стоит проиграть сразу парочку видео? Да ничего:
<!--- Multiple Clips ---> <cfset clips = ArrayNew(1)> <cfset clips[1] = "http://blip.tv/file/get/Twobydit760.flv"> <cfset clips[2] = "http://blip.tv/file/get/N8inpasadena-Flowers457.flv"> <cfvideoplayer video="#clips#" playlist="true" stop="true" autoplay="false"> <!--- Single Clip ---> <cfset singleClip = "http://blip.tv/file/get/N8inpasadena-Flowers457.flv"> <cfvideoplayer video="#singleClip#">
Сразу отправляю вас к wiki-статье, где все параметры и свойства нового тега представлены.
SAVA: ваша бесплатная CMS
Да-да, совершенно бесплатная, многофункциональная, современная CMS, написанная на coldfusion – SAVA.
Open BlueDragon 1.0.1
Вышел очередной релиз бесплатного сервера Open BlueDragon – 1.0.1. Подробности – в официальном пресс-релизе.
Сколько пользователь тратит времени на просмотр страницы?
Интересный вопрос, и его себе задал Рэй Кэмден в своём посте. И, разумеется предложил наилучшее решение:
<cffunction name="onRequestStart" returnType="boolean" output="false"> <cfargument name="thePage" type="string" required="true"> <cfset var data = ""> <cfif arrayLen(session.pages)> <cfset session.pages[arrayLen(session.pages)].duration = dateDiff("s", session.pages[arrayLen(session.pages)].timestamp, now())> </cfif> <cfset data = {page=getCurrentURL(),timestamp=now()}> <cfset arrayAppend(session.pages,data)> <cfreturn true> </cffunction>
и
<cffunction name="onSessionEnd" returnType="void" output="false"> <cfargument name="sessionScope" type="struct" required="true"> <cfargument name="appScope" type="struct" required="false"> <cfset var data = ""> <cfset var filename = ""> <cfwddx action="cfml2wddx" input="#arguments.sessionScope.pages#" output="data"> <cfset filename = expandPath("./" & replace(createUUID(),"-","_","all") & ".txt")> <cfset fileWrite(filename, data)> </cffunction>
Очень интересное решение!
